我有以下模型
public class FooContainer
{
public int ID { get; set; }
public string Name { get; set; }
public IList<Foo> Foos { get; set; }
}
public class Foo
{
public string Name {get; set; }
public string Description {get; set;}
}
示例控制器
public class FooController : Controller
{
public ActionResult Index(){
return View(new FooContainer());
}
[HttpPost]
public ActionResult Index(FooContainer model){
//Do stuff with the model
}
}
我想创建一个视图,使用户能够使用CRUD Foos。
现有研究
我已阅读以下内容:
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
以及以下SO文章
MVC4 Allowing Users to Edit List Items
MVC4 bind model to ICollection or List in partial
所以我知道如何传递IEnumerable&lt;&gt;来回,问题是我想传递一些容器,其他属性包括一个IEnumerable&lt;&gt;
要求
我希望能够绑定到这个复杂的模型,以便它完全传递给控制器。假设控制器除了渲染视图并在post上接收FooController模型之外什么都不做。另外,我想要启用此功能所需的任何相关文章或参考View语法。
提前致谢
答案 0 :(得分:2)
这应该让你开始。
你的模特:
public class FooContainer
{
public int ID { get; set; }
public string Name { get; set; }
public IList<Foo> Foos { get; set; }
}
public class Foo
{
public string Name {get; set; }
public string Description {get; set;}
}
您的控制器操作:
[HttpGet]
public ActionResult Foo()
{
var model = new FooContainer();
return View("Foo", model);
}
[HttpPost]
public ActionResult Foo(FooContainer model)
{
ViewBag.Test = m.Foos[1].Name;
return View("Foo", model);
}
您的观点:
@model DriveAway.Web.Models.FooContainer
@using(Html.BeginForm())
{
<p>@Html.TextBoxFor(m => m.ID)</p>
<p>@Html.TextBoxFor(m => m.Name)</p>
for (int i = 0; i < 5; i++)
{
<p>@Html.TextBoxFor(m => m.Foos[i].Name)</p>
<p>@Html.TextBoxFor(m => m.Foos[i].Description)</p>
}
<button type="submit">Submit</button>
}
@ViewBag.Test
这里发生的是当你按下提交时,iList将被发送到你的HttpPost Foo()动作,在那里你可以随心所欲地做任何事情。在我的示例中,它将显示输入到第二个名称文本框中的内容。显然,你可以循环遍历每个值并检查是否填写了等等。例如
foreach (var f in m.Foos)
if (!string.IsNullOrEmpty(f.Name) && !string.IsNullOrEmpty(f.Description))
addToDB(f); // some method to add to to a database
在视图中我使用了for loop
,其限制为5.但这显然取决于你。