鉴于以下课程,您对处理创建/编辑的最佳方式有何看法,其中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方面的最佳方法是什么?
答案 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 ...