2009-10-16 10 views
10

Sto progettando un sistema di gestione del prodotto. Mi sto chiedendo il modo migliore per gestire una grande quantità di variazioni in ogni azione/vista nella mia applicazione. L'app gestisce 20 categorie e 12 mercati target, ciascuno dei quali influenza i dati che devono essere raccolti per ciascun prodotto. Ad esempio, l'azione "QuickAdd" contiene i dati principali come Product Name e SKU, più alcune altre informazioni chiave basate sulla combinazione della categoria e del mercato di riferimento a cui il prodotto viene aggiunto (esempi di seguito). La categoria e il mercato di destinazione non sono attributi configurabili del prodotto, l'utente che utilizza il sistema può lavorare solo con una combinazione particolare, ad esempio Toys/USA. Il motivo per cui ho detto che non posso progettare il modulo per avere sezioni di attributi per ogni combinazione di Categoria/Mercato, ha bisogno di funzionare come se il modulo fosse fatto solo per quella Categoria/Mercato - l'utente non ha conoscenza di altre combo.Consentire un alto livello di variazione nelle azioni e nelle viste e nei modelli

Alcuni esempi per chiarire si spera le possibili situazioni:

Se io sono l'aggiunta di un prodotto alla categoria Giocattoli con il Target di mercato USA che devo di chiedere la "fascia di età" e "ha fatto esso passare l'ispezione di sicurezza ".

Se sto aggiungendo un prodotto alla categoria Giocattoli con Target Market Messico, ho solo necessario chiedere "Fascia di età".

Se io sono l'aggiunta di un prodotto al categoria Abbigliamento con il Target mercato USA ho bisogno di chiedere per lo "stile" e "materiale"

Se io sono l'aggiunta di un prodotto al Abbigliamento categoria con l'obiettivo mercato in Canada ho bisogno di chiedere per lo "stile" e "materiale" e "USA Prezzo"

abbiamo 20 categorie e 12 target Mercati, in più ci sono 10 forme che devono comportarsi in questa moda, quindi nel teoria ci sono 2400 distinti Azioni/Vista/Models

Quindi la domanda è, in ASP.NET MVC, qual è il modo migliore per gestire la visualizzazione di tutte queste forme dinamiche e la gestione delle variazioni dei dati che vengono inviati all'azione?

EDIT
Un chiarimento su come gli attributi del prodotto sono determinate: Sono basati sulla gerarchia del prodotto appartenente ad una categoria in un mercato. Ad esempio, non è l'aggiunta di tutti gli attributi Toy e gli attributi USA che chiederemmo, sono gli attributi di un prodotto che è un Toy venduto nel mercato USA. Un giocattolo venduto negli Stati Uniti necessita delle informazioni di "ispezione di sicurezza", ma Abbigliamento negli Stati Uniti no. Un giocattolo in Messico inoltre non ha bisogno delle informazioni di "ispezione di sicurezza", quindi quell'attributo non è inerente a tutti i giocattoli o tutti i prodotti degli Stati Uniti, ma piuttosto al fatto che è una combinazione di categoria e mercato.

+0

fare tutti i prodotti che rientrano in una categoria traccia tutti gli attributi di quella categoria? Si può dire lo stesso per gli attributi di ciascun mercato di riferimento? –

+0

Oppure, la relazione tra Categorie e Target Markets è gerarchica? Categoria -> Mercato di destinazione -> Attributo Set –

+0

L'insieme degli attributi del prodotto è uguale all'insieme degli Attributi categoria più l'insieme degli Attributi del Mercato di destinazione, in cui il Mercato di destinazione dipende dalla Categoria? –

risposta

0

finito per usare un'implementazione abbastanza standard di EAV

2

Vorrei creare alcuni modelli di dominio per i tipi di attributi.

public enum AttributeTypeEnum 
{ 
    Currency, 
    Range, 
    List, 
    Number, 
    Text, 
    Boolean 
} 

public interface class IAttribute 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    AttributeTypeEnum AttType { get; set; } 
} 

public abstract class BaseAttribute 
{ 
    int Id { get;set;} 
    string Name { get;set;} 
    AttributeTypeEnum AttType { get; set; } 
} 

public class RangeAttribute<T> : BaseAttribute 
{ 
    T StartValue { get;set; } 
    T EndValue { get; set; } 
} 

quindi associare ogni attributo ad una o più categorie

public class CategoryAttribute 
{ 
    int Id { get; set; } 
    IAttribute Attribute { get; set; } 
} 

È quindi possibile avere una lista di attributi contro ogni categoria

public class CategoryAttributeService() 
{ 
    public IList<CategoryAttributes> GetAttributes(int CategoryId) 
    { 
     return new IList<CategoryAttributes>(); 
    } 
} 

Il controller può quindi restituire un elenco di questi attributi nel ViewData.Model.

// controller action 
public class CategoryAttributeController : Controller 
{ 
    public ActionResult CategoryAttributes(int categoryId) 
    { 
     CategoryAttributeService cas = new CategoryAttributeServices(); 
     ViewData.Model = new CategoryAttributeViewData(categoryId) 
     { 
      Attributes = cas.GetAttributes(categoryId); 
     }; 
     return View(); 
    } 
} 

e lasciate che la vostra vista di gestire il tipo di ciascun elemento e altera il controlli di modulo/visualizzazione di ogni elemento di conseguenza vale a dire (un intervallo con un valore iniziale e finale) un valore booleano avrà una casella di controllo, Materiale potrebbe essere una casella di riepilogo ecc si dispone di una serie di scelte su come gestire il rendering, si potrebbe creare un controllo ascx separato per ogni tipo di attributo per generare i controlli di modulo, o come di seguito creare un metodo di HTML helper

<%@ Page Title="" Language="C#" Inherits="ViewPage<CategoryAttributeViewData>" %> 

<% foreach(CategoryAttribute attribute in ViewData.Model.Attributes) { %> 
<%= Html.RenderAttribute(attribute) %> 
<% } %> 

e il metodo di supporto come

public static string RenderAttribute(this HtmlHelper, ICategoryAttribute att) 
{ 
    StringWriter stringWriter = new StringWriter(); 
    using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter)) 
    { 
     switch(att.AttributeType) 
     { 
      case AttributeDataType.Boolean: 
       CreateCheckBox(writer, att); 
       break; 
      case AttributeDataType.List: 
       CreateListBox(writer, att); 
       break; 
      // Other types     
     } 
    } 
    stringWriter.ToString(); 
} 

MODIFICA: I tipi di mercati di sinistra fuori quanto sopra, quindi se ho capito bene, ogni mercato ha un numero di categorie (uno a molti) Say USA e abbigliamento. La categoria Abbigliamento può apparire in molti mercati. Ogni categoria ha un certo numero di attributi (uno a molti) (Abbigliamento: colore, dimensioni) e ogni attributo può avere molti mercati (uno a molti)

  • un elenco di mercati
  • un elenco di categorie
  • un elenco di MarketCategories
  • un elenco di CategoryAttributes
  • un elenco di attributi
  • un elenco di AttributeMarkets

Mercati> MarketCategories> CategoryAttributes> Attributi> AttributeMarkets

E 'corretto?

Mac.

+1

Sarei curioso di vedere come gestiresti i dati dopo che è stato inviato all'azione. – JeremyWeir

+1

Mi piace l'approccio generale in termini di gestione delle viste. Punti coppia: il CategoryAttributeService non dovrebbe prendere un TargetMarketId? Inoltre, penso che la firma dell'azione assomiglierebbe più a 'public ActionResult QuickAdd (int categoryId, int targetMarketId, stringa productName, stringa sku, IEnumerable attributi)', in cui 'attributes' dovrebbe essere definito con un raccoglitore di modelli. In realtà, un gruppo di parametri potrebbe essere inserito in un parametro Product utilizzando il binding del modello. –

+0

È necessario il targetMarketId ma non il categoryId, basta aggiungere al raccoglitore del modello, inoltre è d'accordo che sarebbe opportuno utilizzare il modello di associazione per abbreviare la firma del metodo e mantenerla pulita. –

0

Per entità modello di ogni categoria, creare una vista del modello che filtra le proprietà in base al mercato attuale,
possibilmente creare un dizionario delle proprietà non filtrati al volo
o un segnale la vista qualche altro modo le proprietà da ignorare/non ignorare.
- Se il filtro per proprietà è eccessivo, è possibile utilizzare una vista modello separata per mercato (utilizzando un dizionario).

Puoi anche utilizzare viste separate, tuttavia ciò ti lascerebbe con un sacco di viste: una vista dinamica che carica il modello di vista corretto in base alla vista (trova la vista del modello tramite il controller) e prende la vista- i filtri del modello in considerazione sarebbero più eleganti.

0

impostare una tabella nel database che sembra qualcosa di simile:

Category nvarchar(*) 
Market nvarchar(*) 
AttributeName nvarchar(*) 
AttributeType nvarchar(*) 

quindi memorizzare ogni combinazione di attributi che è necessario in tale tabella (ovviamente, un po 'di refactoring può essere fatto, come avere un " Attributi "tabella che memorizza se un attributo è richiesto o meno per l'inserimento rapido e consentirebbe combinazioni di categoria/mercato per condividere gli attributi).

Quindi secondo lei, leggere Categoria e di mercato combinata per l'utente e creare dinamicamente la forma:

Nella vostra Page.Load per la forma, istanziare le parti del modulo è necessario, dare loro gli ID significativi, poi nella vostra gestore di postback, leggi tutti i dati dall'oggetto Request.Form.

Un breve esempio:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim stuff As New System.Web.UI.WebControls.TextBox() 
    stuff.ID = "WOW64" 
    Page.Form.Controls.Add(stuff) 
End Sub 

Protected Sub Submit_Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim str As String = Request.Form("WOW64") 
    str = str ' do something with the string' 
End Sub 
Problemi correlati