使用ASP.NET MVC 2中的接口进行模型绑定

时间:2010-04-28 10:16:39

标签: asp.net-mvc

我有以下查看数据:

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:无法创建接口的实例。

任何人都可以对此有所了解。我需要做些什么才能让它发挥作用?

非常感谢

4 个答案:

答案 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参数中指定的方法)。