ASP.NET MVC编辑集合最佳实践 - 您的意见

时间:2008-11-14 02:30:02

标签: asp.net-mvc collections

鉴于以下课程,您对处理创建/编辑的最佳方式有何看法,其中Attributes.Count可以是任何数字。

public class Product {
  public int Id {get;set;}
  public string Name {get;set;}
  public IList<Attribute> Attributes {get;set;}
}

public class Attribute {
  public string Name {get;set;}
  public string Value {get;set;}
}

用户应该能够在同一视图中编辑产品详细信息(名称)和属性详细信息(名称/值),包括添加和删除新属性。

处理模型中的更改很简单,处理UI和ActionMethod方面的最佳方法是什么?

5 个答案:

答案 0 :(得分:14)

请看Steve Sanderson的博文Editing a variable length list, ASP.NET MVC 2-style

控制器

您的操作方法会收到您的原生域模型Product,并且非常简单:

public ActionResult Edit(Product model)

视图

<强> Edit.aspx

<!-- Your Product inputs -->
<!-- ... -->

<!-- Attributes collection edit -->
<% foreach (Attribute attr in Model.Attributes)
   {
       Html.RenderPartial("AttributeEditRow", attr);
   } %>

<强> AttributeEditRow.ascx

请注意帮助者延伸Html.BeginCollectionItem(string)

<% using(Html.BeginCollectionItem("Attributes")) { %>
    <!-- Your Attribute inputs -->
<% } %>

也可以添加和编辑新属性。见帖子。

答案 1 :(得分:3)

使用FormCollection并遍历键/值对。据推测,您可以使用命名方案,以确定哪些键/值对属于您的属性集。

[AcceptVerbs( HttpVerb.POST )]
public ActionResult Whatever( FormCollection form )
{
 ....
}

答案 2 :(得分:3)

使用自定义Model Binder,并像平常一样编写Action方法:

ActionResult Edit(
  int id, 
  [ModelBinder(typeof(ProductModelBinder))] Product product
) ...

在ProductModelBinder中,迭代Form Collection值并绑定到Product实体。这使控制器界面保持直观,并可以帮助测试。

class ProductModelBinder : IModelBinder ...

答案 3 :(得分:0)

取决于您希望为用户创建的体验。我已经为标记内容实现了类似的功能。在模型中,标签表示为IList,但UI在单个文本字段中显示逗号分隔的列表。然后我处理将列表中的项合并为一个字符串以填充文本字段,然后我将输入拆分为将项放回模型中的IList。

在我的DAL中,我接着将List转换为LINQ实体,处理插入和删除等。

这不是最直接的代码,但管理起来并不困难,它为用户提供了预期的界面。

我确信还有其他方法可以处理它,但我会专注于对用户最有效的方法,然后根据它来计算映射细节。

答案 4 :(得分:0)

安德鲁,

我在想一些比标签更难的东西。在这个简单的例子中,名称/值对..颜色:红色;大小:10;材料:棉。

我认为任何可以使用的东西都可以扩展到更复杂的东西。即添加类别并在同一页面上添加所有项目。使用一些jQuery添加另一行相对容易,但是将信息发送到ActionMethod的共识是什么?

您无法编码:

public ActionResult Whatever(stirng attr1Name, string attr2Name, string attr3Name ...

此外,我不认为接受这个也可以:

public ActionResult Whatever(ILIst<Attribute> attributes, string productName ...