ASP.NET MVC强类型视图,用于具有对象集合的类

时间:2009-09-18 11:59:16

标签: asp.net-mvc strongly-typed-view

考虑这种情况:

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

class Category
{
    int id;
    string name;
}

我有一个类Book的强类型视图。当图书管理员想要编辑任何图书的详细信息时,我想显示包含所有可能类别的复选框。如果Book.categories包含类别,则将选中该复选框。

用户可以随意选中和取消选中复选框,然后点击“提交”。我希望我的控制器函数应该使用Book类型的参数调用,并正确设置新的类别集。

如何在ASP.NET MVC中完成?

2 个答案:

答案 0 :(得分:2)

您可能希望将其拆分为几个类,一个是您的书类,一个用于设置视图,另一个用于接收视图的值。这可能听起来有点过头了,但如果没有别的话,那么你就不会把方形钉子撞到一个圆孔里。毕竟,如果您只是使用现在的Book类,您必须弄清楚如何使视图显示您需要的所有内容(说一些类别的复选框...您的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)

答案 1 :(得分:0)

可以通过多种方式完成。

我建议你保持简单的观点。视图应执行一个特定功能。您可以查看该书的详细信息,然后查看编辑该书的视图。这样可以更轻松地创建一个模型,该模型提供存储书籍及其类别所需的信息。


更新

我同意复选框是最好的方法。有关如何在回程中处理它们,请参阅此问题:How to handle checkboxes in ASP.NET MVC forms?