我有以下查看数据:
public class ShoppingCartViewData
{
public IList<IShoppingCartItem> Cart
{
get;
set;
}
}
我在控制器中填充了viewdata:
viewData.Cart = CurrentSession.CartItems;
return View(viewData);
将数据发送到视图并使用以下方式显示:
<% for (int i = 0; i < Model.Cart.Count; i++ ) { %>
<%= Html.TextBoxFor(m => m.Cart[i].Quantity)%>
<%= Html.HiddenFor(m => m.Cart[i].Id) %>
<% } %>
我希望能够抓住帖子上的viewdata。当我尝试:
[HttpPost]
public ActionResult UpdateCart(ShoppingCartViewData viewData)
{
...
}
当我运行它时,我得到一个:System.MissingMethodException:无法创建接口的实例。
任何人都可以对此有所了解。我需要做些什么才能让它发挥作用?
非常感谢
答案 0 :(得分:1)
您可以尝试添加formcollection作为参数。并且viewdata不应该是您正在使用的视图模型吗?
[HttpPost]
public ActionResult UpdateCart(ShoppingCartViewModel viewModel, FormCollection collection)
{
...
}
不确定这是否是确切的解决方案,我也在忙着学习MVC2.0和.NET4; - )
答案 1 :(得分:0)
我将为您的ViewModel创建一个模型绑定器,然后您可以实例化一个具体类型,该类型在绑定到方法参数时实现适当的接口。
您可以在模型绑定器中插入逻辑以适当地读取表单字段,然后实例化正确的IList或IShoppingCartItem数据,因此无需担心被固定到接口的单个实现。
答案 2 :(得分:0)
鉴于我的两条评论,我就是这样做的:
// you don't need this
// viewData.Cart = CurrentSession.CartItems;
// return View(viewData);
// do it like this
return View(CurrentSession.CartItems);
然后有一个强类型视图:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Administration.Master" Inherits="System.Web.Mvc.ViewPage<ShoppingCartViewData>" %>
或者这个:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Administration.Master" Inherits="System.Web.Mvc.ViewPage<List<IShoppingCartItem>>" %>
此代码也不起作用。这将生成一堆具有相同名称和ID的文本框。您需要生成带有计数的文本框,否则您将无法使用 Html.TextBoxFor()。你将不得不恢复到Html.TextBox()或创建一个新的扩展TextBoxFor()方法,它也接受一个数字(为你计数)。
<% for (int i = 0; i < Model.Cart.Count; i++ ) { %>
<%= Html.TextBoxFor(m => m.Cart[i].Quantity)%> // this won't work, if you want to post back all textboxes after they are edited
<%= Html.HiddenFor(m => m.Cart[i].Id) %>
<% } %>
HTH
答案 3 :(得分:0)
在动作方法中添加'int'参数后,我得到了相同的异常。
我发现在控制器构造函数中设置了一个断点,而是调用了其他一个操作方法(而不是在表单post参数中指定的方法)。