ASP.NET MVC строго типизированное представление для класса, имеющего коллекцию объектов - PullRequest
1 голос
/ 18 сентября 2009

Рассмотрим этот сценарий:

class Book
{
    int id;
    List<Category> categories;
}

class Category
{
    int id;
    string name;
}

У меня строго типизированное представление для класса Book. Когда библиотекарь хочет редактировать детали любой Книги, я хочу отобразить флажки со всеми возможными категориями. Если Book.categories содержит категорию, этот флажок будет установлен.

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

Как это можно сделать в ASP.NET MVC?

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

Возможно, вы захотите разделить это на пару классов: один класс вашей книги, один для настройки представления и один для получения значений представления. Это может показаться слишком преувеличенным, но, если ничего другого, это не так, чтобы вы не били квадратный колышек в круглое отверстие. В конце концов, если вы просто перейдете к классу Book, который у вас есть прямо сейчас, вы должны выяснить, как сделать так, чтобы представление отображало все, что вам нужно (скажем, несколько флажков для категорий ... Список, который ваша книга не делает. полностью), а затем отправьте его обратно контроллеру, который должен соответствовать дизайну класса Book. Мне кажется, что в долгосрочной перспективе это намного сложнее и, возможно, невозможно без ущерба для оригинального дизайна книжного класса.

Я бы предложил что-то вроде этого:

class ViewBookModel
{
  public ViewBookModel(Book book, IList<Categories> categoryList)
  {
    BookId = book.Id;
    BookName = book.BookName;
    CategoryList = categoryList;
  }

  public Int32 BookId { get; private set; }
  public String BookName { get; private set; }
  IList<Categories> CategoryList { get; set; }
}

А для отправки обратно в контроллер:

class ViewBookInModel
{
  public String BookId { get; set; }
  public String BookName { get; set }
  public Int32[] CategoryIds { get; set; }
}

И разметка будет выглядеть примерно так:

<%
  foreach(var category in Model.CategoryList)
  {
%>
    <input type="checkbox" name="CategoryIds" value="<%= category.Id %>" />
<%
  }
%>

И метод контроллера в:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateBook(ViewBookInModel book)
0 голосов
/ 18 сентября 2009

Это можно сделать разными способами.

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


Обновление:

Я согласен, флажки - лучший способ. Чтобы узнать, как обрабатывать их в обратном пути, см. Вопрос: Как обрабатывать флажки в формах ASP.NET MVC?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...