Asp.net mvc ASP.NET MVC-以一种形式处理多个对象
我有一个场景我被卡住了-我有一个域对象,它有一个对象集合连接到它。大概是这样的:Asp.net mvc ASP.NET MVC-以一种形式处理多个对象,asp.net-mvc,Asp.net Mvc,我有一个场景我被卡住了-我有一个域对象,它有一个对象集合连接到它。大概是这样的: public class Person { public string Name { get; set; } public IList<PhoneNumber> PhoneNumbers {get; set; } public IList<Address> Addresses { get; set; } } 公共类人物 { 公共字符串名称{get;set;} 公共ILis
public class Person
{
public string Name { get; set; }
public IList<PhoneNumber> PhoneNumbers {get; set; }
public IList<Address> Addresses { get; set; }
}
公共类人物
{
公共字符串名称{get;set;}
公共IList电话号码{get;set;}
公共IList地址{get;set;}
}
客户端需要的UI有一个用于添加和编辑的输入表单。用户可以为每个人输入0到多个电话/地址。如何处理将值集合发回控制器
我可以想出几种方法,但它们似乎都是蛮力的,不是很优雅。有处理这类问题的最佳实践吗 在过去,我用railsy惯例来做这件事
<input name="Parent[childObjectType][serial_number]" type="textbox" value="" />
所以对于你的情况
<input name="Person[PhoneNumber][1]" type="TextBox" value="555-1212" />
<input name="Person[PhoneNumber][2]" type="TextBox" value="555-555-1212" />
您可以增加序列号并在javascript中复制元素以获得多个,并在操作中使用formCollection,这将为您提供获取这些元素的方法
mvc团队的默认设置是使用ModelBinder和点语法进行此操作。
然而,这使得jquery和其他javascript框架变得很笨拙。我已经开始使用json和jquery,在服务器端使用json.NET和JsonFilter将复杂类型发布到控制器操作,它会自动获取json对象并将其序列化为等效的C类型。我发现这是一个非常干净的解决方案,更容易测试。您可以查看这篇文章,并下载示例代码,以开始了解如何执行此操作。这很直截了当
框架通过使用特殊的“表单布局”来支持它。Phil Haack有一篇关于这个的文章 编辑Scott Hanselman()刚刚发布了一个更新。此外,在RC1中,似乎(昨晚遇到这个mysel)索引需要以0为基础并稳步增加(至少如果您正在“绑定”IList)
Edit2链接似乎不起作用在提到Hanselman的帖子中,他写道,你不需要索引,你只需要输入框有相同的名称,并且有一个数组参数在起作用,它就起作用了。我已经做过几次了,并使用Phil Haack的帖子作为指导。这是我最后一次发现如何使用编辑器模板。把这篇文章贴在这里,希望它能帮助其他人(如果我忘了的话,也可以帮助我) 这里我的例子是使用地址(为了简洁起见,只使用一个属性) AddressViewModel.cs
public class AddressViewModel
{
public string Address1 { get; set; }
}
public class AddressViewModels : List<AddressViewModel>
{
}
public class PersonViewModel
{
public AddressViewModels HomeAddresses { get; set; }
}
AddressViewModels.cs
public class AddressViewModel
{
public string Address1 { get; set; }
}
public class AddressViewModels : List<AddressViewModel>
{
}
public class PersonViewModel
{
public AddressViewModels HomeAddresses { get; set; }
}
AddressViewModel.cshtml(编辑器模板)
@model AddressViewModel
@LabelFor(m=>m.Address1)
@Html.TextBoxFor(m=>m.Address1)
AddressViewModels.cshtml(编辑器模板)
@model AddressViewModels
@对于(var i=0;iModel[i])
}
Person.cshtml
@model Person
<h3>Edit Addresses</h3>
@Html.EditorFor(m => m.HomeAddresses)
<button type="submit">Save</button>
@模特儿
编辑地址
@EditorFor(m=>m.HomeAddresses)
拯救
呈现的HTML
<input id="HomeAddresses_Index" name="HomeAddresses.Index" type="hidden" value="0">
<label for="HomeAddresses_1__Address1">Address 1</label>
<input id="HomeAddresses_1__Address1" name="HomeAddresses[1].Address1" type="text" value="P.O.Box 123" >
<button type="submit">Save</button>
地址1
拯救