2009-10-16 3 views
10

Projektuję system zarządzania produktem. Zastanawiam się, jak najlepiej radzić sobie z dużą ilością zmian w każdej akcji/widoku w mojej aplikacji. Aplikacja obsługuje 20 kategorii i 12 rynków docelowych, z których każdy ma wpływ na dane, które należy zebrać dla każdego produktu. Na przykład akcja "Szybkie dodawanie" przyjmuje podstawowe dane, takie jak Nazwa produktu i SKU, oraz kilka innych kluczowych informacji w oparciu o kombinację kategorii i rynku docelowego, do którego produkt jest dodawany (przykłady poniżej). Kategoria i rynek docelowy nie są konfigurowalnymi atrybutami produktu, użytkownik korzystający z systemu może działać tylko w konkretnym zestawie, na przykład Toys/USA. Powodem tego jest to, że nie mogę zaprojektować formularza, aby mieć sekcje atrybutów dla każdej kombinacji kategorii/rynku, musi działać tak, jak formularz jest tworzony tylko dla tej kategorii/rynku - użytkownik nie ma wiedzy o innych kombinacjach.Umożliwianie wysokiego poziomu zmienności w działaniach i widokach oraz modelach

Niektóre przykłady do nadzieją wyjaśnienia możliwe sytuacje:

Jeśli dodaję produkt do kategorii Zabawki z celem rynku USA muszę poprosić o „przedział wiekowy” i „Czy go przejść kontrolę bezpieczeństwa ".

Jeśli dodaję produkt do kategorii Zabawki z rynkiem docelowym w Meksyku, po prostu muszę zapytać o "przedział wiekowy".

Jeśli dodaję produkt do odzieży kategorii z celem rynek USA muszę prosić o „Style” i „materiał”

Jeśli dodaję produkt do odzieży kategorii z celem Rynku Kanadzie muszę prosić o „Style” i „materiał” i „USA Cena”

mamy 20 kategorii i 12 docelowych Targ, plus istnieje 10 formularze, które muszą zachowywać się w w ten sposób, więc w teoria istnieją odrębne Operacje 2400/views/modele

Więc pytanie jest, w ASP.NET MVC, jaki jest najlepszy sposób obsłużyć wyświetlając wszystkie te dynamiczne formularze i obsługi wariacje danych, które zostanie wysłane do akcji?

EDIT
wyjaśnienie, w jaki sposób cechy produktu określane są: Są one oparte na hierarchii produktu należącego do kategorii na rynku. Na przykład, nie jest to dodanie wszystkich atrybutów Toy i atrybutów USA, o jakie byśmy prosili, to atrybuty produktu, który jest Toyem sprzedawanym na rynku USA. Zabawka sprzedawana w USA potrzebuje informacji "kontroli bezpieczeństwa", ale Odzież w USA tego nie robi. Zabawka w Meksyku również nie potrzebuje informacji "kontroli bezpieczeństwa", więc atrybut nie jest nieodłączny dla wszystkich zabawek lub wszystkich produktów z USA, ale raczej z faktu, że jest to kombinacja zarówno kategorii, jak i rynku.

+0

Czy wszystkie produkty, które należą do kategorii śledzić wszystkie atrybuty tej kategorii jest? Czy to samo można powiedzieć o atrybutach każdego rynku docelowego? –

+0

Czy relacja między kategoriami a rynkami docelowymi jest hierarchiczna? Kategoria -> Rynek docelowy -> Zestaw atrybutów –

+0

Czy zestaw atrybutów produktu jest równy zestawowi atrybutów kategorii plus zestawowi atrybutów rynku docelowego, w przypadku których rynek docelowy zależy od kategorii? –

Odpowiedz

2

Chciałbym utworzyć niektóre modele domen dla typów atrybutów.

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; } 
} 

Następnie powiązać każdy atrybut do jednej lub więcej kategorii

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

Można wtedy mieć listę atrybutów przeciw każdej kategorii

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

Twój kontroler może wtedy powrócić wykaz tych atrybuty w 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(); 
    } 
} 

i niech twój widok obsługiwać typ każdego elementu i zmieniać kontrolki formularzy/wyświetlanie każdej pozycji odpowiednio tzn (a zakres ze mają początek i wartości końcowej) logiczną będzie miał wyboru, materiał może być listBox itp masz kilka opcji do wyboru, w jaki sposób poradzić sobie z renderowania, można utworzyć osobną kontrolę .ascx dla każdego typu atrybutu do generowania formantów formularza, lub jak poniżej stworzyć metodę html pomocnika

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

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

i metoda pomocnicza, taka jak

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(); 
} 

EDYCJA: Raczej zostawiłem rynki na powyższym, więc jeśli rozumiem to poprawnie, każdy rynek ma wiele kategorii (jeden do wielu) Powiedzmy USA i odzież. Kategoria Odzież może pojawić się na wielu rynkach. Każda kategoria posiada szereg atrybutów (jeden do wielu) (Ubrania: kolor, rozmiar), a każdy atrybut może mieć wielu rynkach (jeden do wielu)

  • wykaz rynków
  • lista kategorii
  • lista MarketCategories
  • lista CategoryAttributes
  • listę atrybutów
  • lista AttributeMarkets

Rynki> RynekKategorie> Atrybuty kategorii> Atrybuty> AtrybutyMarkets

Czy to prawda?

Mac.

+1

Chciałbym zobaczyć, jak poradzisz sobie z danymi po ich wysłaniu do akcji. – JeremyWeir

+1

Podoba mi się ogólne podejście w zakresie obsługi Wyświetl. Kilka punktów: czy usługa CategoryAttributeService nie musiałaby również przyjmować TargetMarketId? Myślę również, że sygnatura akcji wyglądałaby bardziej jak 'public ActionResult QuickAdd (int id kategorii, id docelowegoMarketId, string productName, string sku, atrybuty IEnumerable ), gdzie' attributes' powinien być zdefiniowany za pomocą spinacza modelu. W rzeczywistości kilka parametrów może zostać przekształconych w parametr produktu za pomocą wiązania modelu. –

+0

Potrzebny Ci będzie identyfikator targetMarketId, ale nie identyfikator kategorii, po prostu dodaj do segregatora modelu, a także upewnij się, że użycie powiązania modelu ma sens, aby skrócić podpis metody i utrzymać go w czystości. –

0

dla modelu jednostki każdej kategorii, należy utworzyć widok modelu, który filtruje właściwości zgodnie z obecnym rynku,
ewentualnie utworzyć słownik właściwości nieprzefiltrowane w locie
lub sygnalizować widoku jakiś inny sposób, które właściwości do ignorowania/nie ignorować.
- Jeśli filtrowanie według właściwości jest zbyt duże, można użyć osobnego widoku modelu na rynek (przy użyciu słownika).

Można również użyć osobnych widoków, ale pozostawiłoby to mnóstwo widoków - jeden dynamiczny widok, który ładuje prawidłowy model widoku zgodnie z widokiem (odnajduje widok modelu za pomocą kontrolera) i przejmuje widok Filtry modelu będą bardziej eleganckie.

0

Ustaw tabelę w bazie danych, który wygląda mniej więcej tak:

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

następnie przechowywać każda kombinacja atrybutów, które trzeba w tej tabeli (oczywiście, niektóre refactoring można zrobić, jak mający " Tabela atrybutów, w której zapisuje się, czy atrybut jest wymagany do szybkiego wstawiania, oraz czy kombinacje kategorii/rynków mogą udostępniać atrybuty).

Następnie w widoku, czytać Użytkownika Kategoria i rynek combo i dynamicznie zbudować postać:

W swojej Page.Load dla postaci, instancję części formularza należy podać im znaczące identyfikatory, następnie w swojej obsługa postback, odczytaj wszystkie dane z obiektu Request.Form.

Krótki przykład:

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