Данные не связаны в методе действия - PullRequest
0 голосов
/ 07 сентября 2011

Я использую базу данных пабов, и в основном я показываю список авторов на одной странице, и там есть ссылка для редактирования.При нажатии на ссылку редактирования отображается одна страница с информацией об авторе и списком флажков с галочкой, кроме названий, написанных конкретным автором.

Это мой код до сих пор:

Методы действийHomeController:

public ActionResult Edit(string id)
{
    author author = db.authors.Include("titleauthors").Where(a => a.au_id == id).Single();

    List<TitleViewModel> titleViewModelList = db.titles.Select<title, TitleViewModel>(title =>
        new TitleViewModel { IsChecked = false, Title = title.title1, title_id = title.title_id }).ToList();

    foreach (var item in author.titleauthors)
    {
        TitleViewModel titleViewModel = titleViewModelList.Where(model => model.title_id == item.title_id).SingleOrDefault();
        if (titleViewModel != null)
            titleViewModel.IsChecked = true;
    }

    AuthorViewModel AuthorViewModel = new AuthorViewModel
    {
        Author = author,
        TitleViewModels = titleViewModelList
    };

    return View(AuthorViewModel);
}

[HttpPost]
public ActionResult Edit(AuthorViewModel AuthorViewModel)
{

    return RedirectToAction("Index");
}

Edit.cshtml:

@model MVCCheckboxList.ViewModels.AuthorViewModel
@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>
    Edit</h2>
<fieldset>
    @using (Html.BeginForm())
    {
        <legend>Edit author</legend>
        <table>
            <tr>
                <td>
                    @Html.LabelFor(model => model.Author.au_fname)
                </td>
                <td>
                    @Html.TextBoxFor(model => model.Author.au_fname)
                </td>
            </tr>
            <tr>
                <td>
                    @Html.LabelFor(model => model.Author.au_lname)
                </td>
                <td>
                    @Html.TextBoxFor(model => model.Author.au_lname)
                </td>
            </tr>
            <tr>
                <td>
                    @Html.LabelFor(model => model.Author.address)
                </td>
                <td>
                    @Html.TextBoxFor(model => model.Author.address)
                </td>
            </tr>
            <tr>
                <td valign="top">
                    Titles
                </td>
                <td>
                    @Html.EditorFor(model => model.TitleViewModels, "TitleViewModels")
                </td>
            </tr>
            <tr>
                <td>
                    <p>
                        <input type="submit" value="Save" />
                    </p>
                </td>
            </tr>
        </table>
    }
</fieldset>

Это мой AuthorViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCCheckboxList.ViewModels
{
    public class AuthorViewModel
    {
        public List<TitleViewModel> TitleViewModels { get; set; }
        public author Author { get; set; }
    }
}

, и это мой TitleViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCCheckboxList.ViewModels
{
    public class TitleViewModel
    {
        public string title_id { get; set; }
        public bool IsChecked { get; set; }
        public string Title { get; set; }
    }
}

Информация корректно отображается на странице редактирования.Но когда я нажимаю на Submit, свойство Author в AuthorViewModel правильно хранит все данные, но List<TitleViewModel> в AuthorViewModel равно нулю.Кто-нибудь может обнаружить ошибку, почему это происходит?

Это мой EditorTemplate (TitleViewModels.cshtml):

@model IEnumerable<MVCCheckboxList.ViewModels.TitleViewModel>
<table>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.HiddenFor(modelItem => item.title_id)
        </td>
        <td>
            @Html.CheckBoxFor(modelItem => item.IsChecked)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
    </tr>
}

</table>

1 Ответ

2 голосов
/ 07 сентября 2011

Здесь вы найдете больше информации о привязке списка.

Просто измените имя шаблона EditorTemplate на TitleViewModel.cshtml и вставьте этот код:

@model MVCCheckboxList.ViewModels.TitleViewModel

<td>
    @Html.HiddenFor(modelItem => Model.title_id)
</td>
<td>
    @Html.CheckBoxFor(modelItem => Model.IsChecked)
</td>
<td>
    @Html.DisplayFor(modelItem => Model.Title)
</td>

В Edit.cshtml используйте приведенный ниже код для создания редактора для каждого элемента из вашего списка

<table>
@for (int i = 0; i < Model.TitleViewModels.Count; i++) {
    @Html.EditorFor(m => Model.TitleViewModels[i])
}
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...