3

私はまだ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 パラメーターは空のリストです。ビューで使用されているモデルをコントローラーに戻して、ポスト アクションで使用するにはどうすればよいですか? 投稿アクションは次のようになります

    [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);
    }
4

2 に答える 2

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/

于 2012-10-31T06:29:06.513 に答える
2

わかりました、ユーザーIDを含めるために作成した匿名オブジェクトでmoviesパラメーターを手動で設定しようとしていました。映画のプロパティを含めることで、バインディングをオーバーライドしていました。

私の見解では、 using ステートメント

@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 が述べたように、foreach ループの代わりに for ループを使用する必要があります。そうしないと、モデルにバインドされません。

于 2012-10-31T07:08:06.843 に答える