鉴于以下类型
public class SomeValue
{
public int Id { get; set; }
public int Value { get; set; }
}
public class SomeModel
{
public string SomeProp1 { get; set; }
public string SomeProp2 { get; set; }
public IEnumerable<SomeValue> MyData { get; set; }
}
我想为SomeModel
类型创建一个编辑表单,其中包含SomeProp1
和SomeProp2
的常用文本字段,然后是包含每个{{1}文本字段的表格在SomeValue
集合中。
这是怎么做到的?如何将值绑定回模型?
我目前有一个表单,显示每个值的文本字段,但它们都具有相同的名称和相同的ID。这显然不是有效的HTML,并且会阻止MVC将值映射回来。
答案 0 :(得分:14)
您可以使用编辑器模板进行操作。这样,框架将处理所有事情(从正确命名输入字段到在post操作中正确绑定值)。
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
// In the GET action populate your model somehow
// and render the form so that the user can edit it
var model = new SomeModel
{
SomeProp1 = "prop1",
SomeProp2 = "prop1",
MyData = new[]
{
new SomeValue { Id = 1, Value = 123 },
new SomeValue { Id = 2, Value = 456 },
}
};
return View(model);
}
[HttpPost]
public ActionResult Index(SomeModel model)
{
// Here the model will be properly bound
// with the values that the user modified
// in the form so you could perform some action
return View(model);
}
}
查看(~/Views/Home/Index.aspx
):
<% using (Html.BeginForm()) { %>
Prop1: <%= Html.TextBoxFor(x => x.SomeProp1) %><br/>
Prop2: <%= Html.TextBoxFor(x => x.SomeProp2) %><br/>
<%= Html.EditorFor(x => x.MyData) %><br/>
<input type="submit" value="OK" />
<% } %>
最后编辑模板(~/Views/Home/EditorTemplates/SomeValue.ascx
)将自动为MyData
集合的每个元素调用:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %>
<div>
<%= Html.TextBoxFor(x => x.Id) %>
<%= Html.TextBoxFor(x => x.Value) %>
</div>
答案 1 :(得分:1)
IList
实现了IEnumerable,因此您可以像这样修改模型:
public class SomeModel {
public string SomeProp1 { get; set; }
public string SomeProp2 { get; set; }
public IList<SomeValue> MyData { get; set; }
}
您可以使用IModelBinder
界面为特定型号创建活页夹。有几种方法可以做到这一点。您可以为模型创建EditorFor
cshtml,它将遍历您的SomeValue
列表并输出相应的ID,而不是。然后,在您的ModelBinder
实现中,您将通过您的ID读取并适当地绑定它们。我可以在一段时间内发布一份工作样本。