我不熟悉ASP.net MVC3,我正在尝试创建一个可添加到用户的可选项目列表。所以Get方法看起来像
public ViewResult AddFavourite(int id)
{
ViewBag.UserId = id;
var movies = (from m in db.Movies
select new SelectableMovie() { Movie = m });
return View(movies.ToList());
}
,视图看起来像
@using MovieManager.Models
@model List<SelectableMovie>
@using (Html.BeginForm("AddFavourite", "Users",
new { userId = ViewBag.UserId, movies = Model }, FormMethod.Post))
{
<table>
<tr>
<th>
Add
</th>
<th>
Title
</th>
<th>
Description
</th>
<th>
ReleaseDate
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.CheckBoxFor(modelItem => item.Selected)
</td>
<td>
@Html.DisplayFor(modelItem => item.Movie.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Movie.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Movie.ReleaseDate)
</td>
</tr>
}
</table>
<p>
<input type="submit" value="Add Favourites" />
</p>
}
这会按预期显示列表但是当我回发到控制器时,我得到一个userId但是movies参数是一个空列表。如何将视图中使用的模型返回到控制器中以便在Post Action中使用? Post动作看起来像这样
[HttpPost]
public ActionResult AddFavourite(int userId, List<SelectableMovie> movies)
{
User user = db.Users.Single(u => u.ID == UserId);
//add items here
return View("Details", user);
}
答案 0 :(得分:6)
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.CheckBox("movies[" + i + "].Selected", Model[i].Selected)
</td>
<td>
@Html.Display("movies[" + i + "].Movie.Title", Model[i].Movie.Title)
</td>
<td>
@Html.Display("movies[" + i + "].Movie.Description", Model[i].Movie.Description)
</td>
<td>
@Html.Display("movies[" + i + "].Movie.ReleaseDate", Model[i].Movie.ReleaseDate)
</td>
</tr>
}
编辑:这是一个很好的例子:http://code-inside.de/blog-in/2012/09/17/modelbinding-with-complex-objects-in-asp-net-mvc/
答案 1 :(得分:2)
得到它,我试图在我创建的匿名对象中手动设置movies参数以包含用户ID。通过包含电影属性,它取代了绑定。
在我看来使用声明
@using (Html.BeginForm("AddFavourite", "Users",
new { userId = ViewBag.UserId, movies = Model }, FormMethod.Post))
{
应该只是
@using (Html.BeginForm("AddFavourite", "Users",
new { userId = ViewBag.UserId }, FormMethod.Post))
{
MVC模型绑定器在我的Post方法
中处理movie参数除此之外,因为@karaxuna声明你需要使用for循环而不是foreach循环,否则它将不会绑定到模型。