ASP.NET MVC3: объект из DropdownList в нуле в контроллере - PullRequest
1 голос
/ 18 февраля 2012

Я создал образец приложения MVC3 для BookShop.У меня есть действие по созданию.В действии создания пользователи вводят название книги, имя автора и выбирают название жанра.Работает без ошибок.Но в контроллере я не получаю название выбранного жанра (- объект жанра имеет значение null).Как мы можем это исправить?

Примечание: Когда я пишу @Html.DropDownList("GenreId", String.Empty), возможности привязки модели, встроенные в ASP.NET MVC, будут пытаться заполнить объект этого типа с помощью входных данных формы.Например, он попытается установить значение GenreId объекта книги.Но Book не содержит свойство GenreId.Однако раскрывающийся список может отображать значения путем чтения требуемых значений из ViewBag.

CODE

@model MyBookShopApp.Book

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {

@Html.ValidationSummary(true)

<fieldset>

    <legend>BOOK</legend>


    <div >
        @Html.LabelFor(model => model.Title) :~: @Html.EditorFor(model => model.Title)
    </div>


    <div >
        @Html.LabelFor(model => model.Artist.Name )  :*: @Html.EditorFor(model => model.Artist.Name)
    </div>


    <div >
        @Html.LabelFor(model => model.GenreEntity.Name, "The Genre") ::   @Html.DropDownList("GenreId", String.Empty)
    </div>


    <p>
        <input type="submit" value="Create" />
    </p>

</fieldset>
}

<div>
 @Html.ActionLink("Back to List", "Index")
</div>

CONTROLLER

namespace MyBookShopApp.Controllers
{
public class StoreManagerController : Controller
{

    List<GenreEntity> listOfGenres = new List<GenreEntity>()
                                    {
                                       new GenreEntity { Name = "Fiction", GenreId = 1 },
                                       new GenreEntity { Name = "Science", GenreId = 2 },
                                       new GenreEntity { Name = "Religious", GenreId = 3 },
                                    };

    List<Book> bookList = new List<Book>()
                          {
                            new Book
                            {
                                BookId = 1,Title = "Book1",
                                GenreEntity = new GenreEntity { Name = "Fiction", GenreId = 1 },
                                Artist = new Artist { ArtistId = 1, Name = "Dinesh" }
                            },
                            new Book
                            {
                                BookId = 2,Title = "Book2",
                                GenreEntity = new GenreEntity { Name = "Science", GenreId = 2 },
                                Artist = new Artist { ArtistId = 1, Name = "Lijo" }
                            },
                            new Book
                            {
                                BookId = 3,Title = "Book3",
                                GenreEntity = new GenreEntity { Name = "Religious", GenreId = 3 },
                                Artist = new Artist { ArtistId = 1, Name = "Santhosh" }
                            }

                          };





    #region CREATE



    // GET: 
    public ActionResult Create()
    {
                    ViewBag.GenreId = new SelectList(listOfGenres, "GenreId", "Name");
        return View();
    }

    // POST:
    [HttpPost]
    public ActionResult Create(Book theBook)
    {
        if (ModelState.IsValid)
        {
            //Save the book in DB first and then redirectToAction.
            return RedirectToAction("Index");
        }

        return View(theBook);
    }

    #endregion


}
}

Класс книги

public class Book
{
    public int BookId { get; set; } 
    public string Title { get; set; }
    public GenreEntity GenreEntity { get; set; }
    public Artist Artist { get; set; }

}

GenreEntity

  public class GenreEntity
{
    public string Name { get; set; }
    public int GenreId { get; set; }
}

Исполнитель Класс

 public class Artist
{
    public int ArtistId { get; set; }
    public string Name { get; set; }
}

ССЫЛКА :

  1. в форме редактирования mvc3

  2. Как использовать Html.DropDownList в строго типизированном представлении для модели, содержащей свойство enullable enum?

  3. MVC3 HTML-помощник не обновляет DropdownListFor при отправке формы

  4. при выборе события изменения - Html.DropDownListFor

  5. MVC3 @ Html.DropDownListДля невыполнения выбранного элемента

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

@Html.DropDownList("GenreId", String.Empty) создает SELECT с именем GenreId. Однако MVC3 ожидает, что имя GenreEntity.Name будет привязано к Book.

Простое решение - изменить public ActionResult Create(Book theBook) на public ActionResult Create(Book theBook, string genreId), чтобы получить genreId, который был отправлен обратно

С другой стороны

@Html.LabelFor(model => model.GenreEntity.GenreId, "The Genre")
@Html.DropDownListFor(model => model.GenreEntity.GenreId, (SelectList)ViewBag.GenreId, String.Empty)

Не забудьте также установить свой ViewBag внутри метода HttpPost Create.

Редактировать Исправлено имя свойства из BookId в GenreId

1 голос
/ 18 февраля 2012

Ваш DropDown пытается присвоить свое значение свойству Book.GenreId. Ваш класс GenreEntity имеет свойство GenreId, а не Book (на основе кода, который вы вставили выше).

Вы можете исправить это, изменив раскрывающийся список следующим образом:

@Html.DropDownList("GenreEntity.GenreId", String.Empty)

Это скажет MVC присвоить значение раскрывающегося списка Book.GenreEntity.GenreId.

...