2009-10-16 54 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