Asp.net MVC3-将带有动态数据的整个模型从视图传递到控制器
我有两种型号:外层型号和内层型号。外部模型和内部模型之间分别存在一对多关系。为了澄清我的问题,我的模型是IEnumerable类型。我将随机数量的外部模型传递给视图,用户为每个外部模型创建任意数量的内部模型。然后在提交时,我希望控制器接收外部模型的列表,以便可以将内部模型添加到数据库中,并添加到其预期的外部模型中 我相信我有正确的命名约定来使用MVC的内置模型绑定。下面是它的样子:Asp.net MVC3-将带有动态数据的整个模型从视图传递到控制器,asp.net,asp.net-mvc,asp.net-mvc-3,model-binding,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Model Binding,我有两种型号:外层型号和内层型号。外部模型和内部模型之间分别存在一对多关系。为了澄清我的问题,我的模型是IEnumerable类型。我将随机数量的外部模型传递给视图,用户为每个外部模型创建任意数量的内部模型。然后在提交时,我希望控制器接收外部模型的列表,以便可以将内部模型添加到数据库中,并添加到其预期的外部模型中 我相信我有正确的命名约定来使用MVC的内置模型绑定。下面是它的样子: OuterModel[i].InnerModel[j].Property 我的问题是,我真的不知道如何将外部模型
OuterModel[i].InnerModel[j].Property
我的问题是,我真的不知道如何将外部模型列表传递给控制器。以下是我在我看来尝试过的:
@model IEnumerable<OuterModel>
@using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post))
{
//Code to create the InnerModels here
}
@model IEnumerable
@使用(Html.BeginForm(“Create”,“Controller”,new{OuterModels=Model},FormMethod.Post))
{
//在此处创建内部模型的代码
}
以下是我控制器中的内容:
[HttpPost]
public ActionResult Create(IEnumerable<OuterModel> OuterModels, FormCollection fc)
{
String[] keys = fc.AllKeys;
if(ModelState.IsValid){
//Add to db
}
}
public class BookController : Controller
{
public static List<Book> _model = null;
public List<Book> Model
{
get
{
if (_model == null)
{
_model = new List<Book>
{
new Book{
Name = "Go Dog Go",
Authors = new List<Author>{
new Author{Name = "Dr. Seuss"}
}},
new Book{
Name = "All the Presidents Men",
Authors = new List<Author>{
new Author{Name = "Woodward"},
new Author{Name = "Bernstein"}
}},
new Book{
Name = "Pro ASP.NET MVC Framework",
Authors = new List<Author>{
new Author{Name = "Sanderson"},
new Author{Name = "Stewart"},
new Author {Name = "Freeman"}
}}
};
}
return _model;
}
}
public ActionResult Index()
{
return View(Model);
}
public ActionResult Edit()
{
return View(Model);
}
[HttpPost]
public ActionResult Edit(List<Book> books)
{
_model = books;
return RedirectToAction("Index");
//return View(books);
}
}
[HttpPost]
公共操作结果创建(IEnumerable外部模型,FormCollection fc)
{
字符串[]键=fc.AllKeys;
if(ModelState.IsValid){
//添加到数据库
}
}
键显示我的所有属性都遵循我先前指定的命名约定,但ModelState.IsValid返回false。它显示最外层模型的计数为0
即使我告诉表单在创建任何InnerModels之前提交OuterModels=Model,您也会认为在将数据传递到视图之前,OuterModels中仍然会有数据。我今天真的很累,所以我猜我在看一个(或多个)小细节。有什么建议吗
--编辑--
将外部模型列表传递给控制器可能不是最佳方法。如果有人有更好的建议,请分享。只要索引使用得当,这就不应该成为问题。下面是我对表单名称的设想 模型[0]。foo 模型[0]。内部[0]。条形图 模型[0]。内部[1]。条形图 其中外部模型有一个名为foo和 外部模型有一个名为“内部”的属性,它是内部对象的集合。内部对象有一个名为bar的属性。如果表单是使用正确的索引呈现的,那么模型绑定应该可以工作。如果表单字段是在客户端生成的,事情可能会变得棘手。我建议返回服务器以操作模型。有一些额外的往返,但您可以通过Ajax请求进行 下面是一个更加充实的示例中的更多细节
public class InnerModel{
public string Name{get; set;}
}
public class OuterModel{
public List<InnerModel> InnerModels{get; set;}
public string Name{get; set;}
}
这是我为我所教的班级做的一个例子。。那肯定有效
public class Author
{
public string Name { get; set; }
}
public class Book
{
public string Name { get; set; }
public List<Author> Authors { get; set; }
}
公共类作者
{
公共字符串名称{get;set;}
}
公共课堂用书
{
公共字符串名称{get;set;}
公共列表作者{get;set;}
}
控制器:
[HttpPost]
public ActionResult Create(IEnumerable<OuterModel> OuterModels, FormCollection fc)
{
String[] keys = fc.AllKeys;
if(ModelState.IsValid){
//Add to db
}
}
public class BookController : Controller
{
public static List<Book> _model = null;
public List<Book> Model
{
get
{
if (_model == null)
{
_model = new List<Book>
{
new Book{
Name = "Go Dog Go",
Authors = new List<Author>{
new Author{Name = "Dr. Seuss"}
}},
new Book{
Name = "All the Presidents Men",
Authors = new List<Author>{
new Author{Name = "Woodward"},
new Author{Name = "Bernstein"}
}},
new Book{
Name = "Pro ASP.NET MVC Framework",
Authors = new List<Author>{
new Author{Name = "Sanderson"},
new Author{Name = "Stewart"},
new Author {Name = "Freeman"}
}}
};
}
return _model;
}
}
public ActionResult Index()
{
return View(Model);
}
public ActionResult Edit()
{
return View(Model);
}
[HttpPost]
public ActionResult Edit(List<Book> books)
{
_model = books;
return RedirectToAction("Index");
//return View(books);
}
}
公共类BookController:控制器
{
公共静态列表_model=null;
公共列表模型
{
得到
{
如果(_model==null)
{
_模型=新列表
{
新书{
Name=“Go Dog Go”,
作者=新列表{
新作者{Name=“Dr.Seuss”}
}},
新书{
Name=“所有总统先生”,
作者=新列表{
新作者{Name=“Woodward”},
新作者{Name=“Bernstein”}
}},
新书{
Name=“Pro ASP.NET MVC Framework”,
作者=新列表{
新作者{Name=“Sanderson”},
新作者{Name=“Stewart”},
新作者{Name=“Freeman”}
}}
};
}
回归模型;
}
}
公共行动结果索引()
{
返回视图(模型);
}
公共行动结果编辑()
{
返回视图(模型);
}
[HttpPost]
公共行动结果编辑(书籍列表)
{
_模型=书籍;
返回操作(“索引”);
//返回视图(书籍);
}
}
和视图:
@model List<AmazonWeb.Models.Book>
@{
ViewBag.Title = "Index";
}
<div class="content">
@Html.ActionLink("Index", "Index")
@using (Html.BeginForm())
{
<input type="submit" value="save" />
<ul class="book-list">
@for (var i = 0; i < Model.Count; i++ )
{
<li>
<label>Book Name</label> : @Html.TextBoxFor(m => Model[i].Name)
<ul>
@for (var j = 0; j < Model[i].Authors.Count; j++ )
{
<li><label>Author Name</label> : @Html.TextBoxFor(m => Model[i].Authors[j].Name)</li>
}
</ul>
</li>
}
</ul>
<input type="submit" value="save" />
}
</div>
@型号列表
@{
ViewBag.Title=“Index”;
}
@ActionLink(“索引”、“索引”)
@使用(Html.BeginForm())
{
@对于(var i=0;i
书名:@Html.TextBoxFor(m=>Model[i].Name)
@对于(var j=0;j作者姓名:@Html.TextBoxFor(m=>Model[i]。作者[j]。姓名)
}
}
}
My indice值是正确的,表单实际上是通过AJAX请求创建的,该请求为新的一行编辑器字段呈现部分视图。这很有帮助,但与我的要求相差不远。我没有显式地传递控制器操作的参数,而是将其保留为null。换句话说,我将新的{OuterModel=Model}更改为null。现在,我的InnerModel数据被传递到ModelState,但是原始的OuterModel数据没有显示出来。今天是漫长的一天。我明天会解决这个问题。谢谢你提供了一个有效的例子。在我的例子中,我需要将参数传递到using语句中,因为我需要显式地声明这是一个POST操作。否则,来自PartialView的数据将无法传递到控制器。出于某种原因,我认为我需要在using语句中将模型作为参数传递。显然,这就是造成我问题的原因。不管怎样,问题现在已经解决了。你必须在这里发布代码来创建内部模型。我不太愿意发布我的代码,因为这段代码与实际问题无关。我的问题出在爸爸身上
@model List<AmazonWeb.Models.Book>
@{
ViewBag.Title = "Index";
}
<div class="content">
@Html.ActionLink("Index", "Index")
@using (Html.BeginForm())
{
<input type="submit" value="save" />
<ul class="book-list">
@for (var i = 0; i < Model.Count; i++ )
{
<li>
<label>Book Name</label> : @Html.TextBoxFor(m => Model[i].Name)
<ul>
@for (var j = 0; j < Model[i].Authors.Count; j++ )
{
<li><label>Author Name</label> : @Html.TextBoxFor(m => Model[i].Authors[j].Name)</li>
}
</ul>
</li>
}
</ul>
<input type="submit" value="save" />
}
</div>