2009-10-16 40 views
10

我正在設計一個產品管理系統。我想知道在我的應用程序中處理每個Action/View中的大量變化的最佳方式。該應用程序處理20個類別和12個目標市場,每個類別都會影響每個產品需要收集的數據。例如,「QuickAdd」操作會採用產品名稱和SKU等核心數據,以及基於添加產​​品的類別和目標市場組合(以下示例)的一些其他關鍵信息。類別和目標市場不是產品的可配置屬性,使用該系統的用戶只能在特定組合下工作,例如玩具/美國。之所以提到這一點,是因爲我無法將表單設計爲每個類別/市場組合的屬性部分,它需要像表單僅用於類別/市場一樣工作 - 用戶不知道其他組合。允許動作和視圖以及模型的高度變化

一些例子,希望能夠澄清可能的情況:

如果我增加了產品類別 與目標市場美國的玩具,我需要 問,「年齡範圍」和「有沒有 它通過安全檢查「。

如果我要添加產品到類別 玩具目標市場墨西哥,我只需 需要「年齡範圍」。

如果我增加了產品與目標 市場美國的 類服裝我要問的 「風格」和「材料」

如果我增加了產品的 類別服裝與目標 市場加拿大我要問的 「風格」和「材料」和「美國價格」

我們有20個大類和12個目標 市場,再加上有一些 需要表現得10種形式這種方式,所以在 理論有2400截然不同的 操作/瀏覽/型號

所以現在的問題是,在ASP.NET MVC中,什麼是處理顯示所有這些動態的形式和處理那些被髮送數據的變化的最佳方式行動?

編輯
如何在產品的屬性確定的澄清:這是基於屬於一個市場類別產品的層次結構。例如,它不是我們要求的所有玩具屬性和美國屬性的增加,而是美國市場上銷售的玩具產品的屬性。在美國銷售的玩具需要「安全檢查」信息,但美國的服裝則不需要。墨西哥的玩具也不需要「安全檢查」信息,因此屬性不是所有玩具或所有美國產品固有的,而是屬於類別和市場的組合。

+0

不要落入一個類別中的所有產品跟蹤所有該類別的屬性?對於每個目標市場的屬性可以這麼說嗎? – 2009-10-22 17:19:30

+0

或者,分類與目標市場分級之間的關係?類別 - >目標市場 - >屬性集 – 2009-10-22 17:22:29

+0

產品屬性集合是否等於類別屬性集合加上目標市場屬性集合,目標市場依賴於類別? – 2009-10-22 17:26:09

回答

2

我會爲屬性類型創建一些域模型。

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

然後,每個屬性的一個或多個類別

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

關聯然後可以有屬性的列表,針對每個類別

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

你的控制器就可以返回這些列表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(); 
    } 
} 

,讓你的視圖處理的每個項目的類型和改變每個項相應地即一個布爾值將有一個複選框(與具有開始和結束值的範圍)的形式控制/顯示,物料可能是一個列表框等 你有一些關於如何處理渲染的選擇,你可以創建一個單獨的.ascx控制每個屬性類型生成表單控件,或者按照下面創建一個HTML helper方法

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

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

和幫手方法如

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

編輯:我有點離開以上所以如果我正確地理解這一點,每個市場都有一些類別(一對多)說美國和服裝。 類別服裝可以出現在許多市場。 每個類別有許多屬性(一對多)(服裝:顏色,大小),並且每個屬性可以有許多市場(一對多)

  • 市場的列表
  • 類別
  • 的列表
  • MarketCategories名單
  • CategoryAttributes名單
  • 屬性的列表
  • AttributeMarkets名單

市場>市場分類>類別屬性>屬性>屬性市場

這是正確的嗎?

Mac。

+1

我很想知道如何處理髮送給操作後的數據。 – JeremyWeir 2009-10-22 04:41:31

+1

我喜歡View處理的一般方法。幾點:CategoryAttributeService不會需要TargetMarketId嗎?另外,我認爲動作簽名看起來更像'public ActionResult QuickAdd(int categoryId,int targetMarketId,string productName,string sku,IEnumerable attributes)',其中'attributes'應該使用模型綁定器來定義。實際上,可以使用模型綁定將一堆參數放入產品參數中。 – 2009-10-22 23:12:15

+0

您需要targetMarketId,但不需要categoryId,只需添加到模型聯編程序,同意使用模型綁定來縮短方法簽名並保持清潔是有意義的。 – 2009-10-22 23:53:42

0

對於每個類別的模型實體,創建根據當前市場濾波器特性的模型圖,
可能動態創建
未過濾的屬性的辭典或信號視圖某種其它方式的屬性要忽略的/不忽視。
- 如果每個屬性的過濾太多,則可以使用單獨的模型 - 每個市場的視圖(使用字典)。

您也可以使用單獨的視圖,但這會讓您看到大量視圖 - 一個動態視圖根據視圖加載正確的視圖模型(通過控制器查找模型視圖)並將視圖 - 模型的過濾器會更加優雅。

0

建立在你的數據庫中的表,看起來是這樣的:

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

然後屬性的,你該表需要(每個組合存儲顯然,一些重構可以做到的,就像一個「屬性「表存儲快速插入是否需要屬性,並允許類別/市場組合共享屬性)。

那麼在你看來,閱讀用戶的類別和市場組合,並動態地構建形式:

在你Page.Load的形式,實例化你需要的形式部分,給他們有意義的ID,然後在您的回發處理程序,讀取Request.Form對象中的所有數據。

簡單例子:

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