考虑这种情况:
class Book
{
int id;
List<Category> categories;
}
class Category
{
int id;
string name;
}
我有一个类Book的强类型视图。当图书管理员想要编辑任何图书的详细信息时,我想显示包含所有可能类别的复选框。如果Book.categories包含类别,则将选中该复选框。
用户可以随意选中和取消选中复选框,然后点击“提交”。我希望我的控制器函数应该使用Book类型的参数调用,并正确设置新的类别集。
如何在ASP.NET MVC中完成?
答案 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?