Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 后置模型到控制器方法_Asp.net Mvc_Asp.net Mvc 3_Model View Controller - Fatal编程技术网

Asp.net mvc 后置模型到控制器方法

Asp.net mvc 后置模型到控制器方法,asp.net-mvc,asp.net-mvc-3,model-view-controller,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,在过去的几周里,我一直在快速学习MVC 3,但是出现了一些我几个小时都无法解决的问题。我正在开发一个简单的购物车,并试图在结账过程中以线性路径传递数据。无论我怎么做,我都无法将模型发布到下一个视图 首先,使用IModelBinder的实现从会话中提取“Cart”实体。它基本上适用于任何方法。有一段时间它一直工作得很好。我的问题是试图在/cart/confirm和/cart/checkout之间传递相同的模型 有人能帮我弄清楚为什么/cart/checkout控制器中的模型总是空的吗? publi

在过去的几周里,我一直在快速学习MVC 3,但是出现了一些我几个小时都无法解决的问题。我正在开发一个简单的购物车,并试图在结账过程中以线性路径传递数据。无论我怎么做,我都无法将模型发布到下一个视图

首先,使用IModelBinder的实现从会话中提取“Cart”实体。它基本上适用于任何方法。有一段时间它一直工作得很好。我的问题是试图在/cart/confirm和/cart/checkout之间传递相同的模型

有人能帮我弄清楚为什么/cart/checkout控制器中的模型总是空的吗?

public class CartController : Controller
{

public ActionResult Index (Cart cart)
{
   //Works fine, anonymous access to the cart
   return View(cart);
}

[Authorize]
public ActionResult Confirm (Cart cart)
{
   //Turn 'Cart' from session (IModelBinder) into a 'Entities.OrderDetail'
   OrderDetail orderDetail = new OrderDetail();
   orderDetail.SubTotal = cart.ComputeTotalValue();
   ...
   ...
   return View(orderDetail);
}

[Authorize]
public ActionResult Checkout(OrderDetail model)
{
   //PROBLEM: model is always null here.
}

}
/Views/Cart/Index.aspx看起来像这样(对不起,没有剃刀):


...
...
这里没什么可看的,只是一张有购物车商品的桌子
我怀疑问题就在这里,但我已经尝试了Html.BeginForm()的每一种变体,我可以尝试,但无法将模型传递到/cart/checkout。无论如何,/Views/Cart/Confirm.aspx如下所示:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site-1-Panel.Master" Inherits="System.Web.Mvc.ViewPage<My.Namespace.Entities.OrderDetail>" %>
...
...
<% using (Html.BeginForm("checkout", "cart", Model)) { %>
<%: Model.DBUserDetail.FName %>
<%: Model.DBUserDetail.LName %>
<%: Html.HiddenFor(m => m.DBOrder.ShippingMethod, new { @value = "UPS Ground" })%>
<%: Html.HiddenFor(m => m.DBOrder.ShippingAmount, new { @value = "29.60" })%>
...
...
<input type="submit" value="Confirm &amp; Pay" />
<% } %>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site-1-Panel.Master" Inherits="System.Web.Mvc.ViewPage<My.Namespace.Entities.OrderDetail>" %>
...
...
<%: Html.Hidden("x_first_name", Model.DBUserDetail.FName) %>
<%: Html.Hidden("x_last_name", Model.DBUserDetail.LName) %>
...
It doesn't really matter what's here, an exception gets throw in the controller because the model is always null

...
...
m、 DBOrder.ShippingMethod,新的{@value=“UPS Ground”})%>
m、 DBOrder.ShippingAmount,新的{@value=“29.60”})%>
...
...
最后,/Views/Cart/Checkout.aspx如下所示:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site-1-Panel.Master" Inherits="System.Web.Mvc.ViewPage<My.Namespace.Entities.OrderDetail>" %>
...
...
<% using (Html.BeginForm("checkout", "cart", Model)) { %>
<%: Model.DBUserDetail.FName %>
<%: Model.DBUserDetail.LName %>
<%: Html.HiddenFor(m => m.DBOrder.ShippingMethod, new { @value = "UPS Ground" })%>
<%: Html.HiddenFor(m => m.DBOrder.ShippingAmount, new { @value = "29.60" })%>
...
...
<input type="submit" value="Confirm &amp; Pay" />
<% } %>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site-1-Panel.Master" Inherits="System.Web.Mvc.ViewPage<My.Namespace.Entities.OrderDetail>" %>
...
...
<%: Html.Hidden("x_first_name", Model.DBUserDetail.FName) %>
<%: Html.Hidden("x_last_name", Model.DBUserDetail.LName) %>
...
It doesn't really matter what's here, an exception gets throw in the controller because the model is always null

...
...
...
这里的内容并不重要,控制器中会抛出异常,因为模型总是空的

您的模型状态很可能无效。并在行动的第一行调用它,如:

ModelState.DumpErrors();
将断点放在它的后面一行,并检查输出窗口以了解有关绑定错误的更多信息

编辑-完全扩展方法:

public static class ModelExtensions
{
    public static void DumpErrors(this System.Web.Mvc.ModelStateDictionary ModelState)
    {
        var errors = from key in ModelState
                     let errorList = ModelState[key.Key].Errors
                     where errorList.Any()
                     select new
                     {
                         Item = key.Key,
                         Value = key.Value,
                         errorList
                     };

        foreach (var errorList in errors)
        {
            System.Diagnostics.Debug.WriteLine("MODEL ERROR:");
            System.Diagnostics.Debug.WriteLine(errorList.Item);
            System.Diagnostics.Debug.WriteLine(errorList.Value);
            foreach (var error in errorList.errorList)
            {
                System.Diagnostics.Debug.WriteLine(error.ErrorMessage);
                System.Diagnostics.Debug.WriteLine(error.Exception);
            }
            System.Diagnostics.Debug.WriteLine("-----");
        }
    }
}

我不知道asp的具体情况,但似乎您可以访问索引中的购物车,并确认b/c您正在显式传递它。因为您没有将它传递给签出,所以您将无法访问它。我可能已经完全关闭了

问题在于无法访问cart对象,因为我的IModelBinder实现使它随时可用。我得到一个空的OrderDetail。我认为asawyer为我指出了下面正确的方向……你确实教了我一个发现模型错误的好方法,这肯定让我走上了正确的方向。这是我试图用作模型的“Entities.OrderDetail”的问题。该实体仅包含2个公共对象,它们都是Linq到SQL对象。也许我不能用它作为模型,必须使用POCO对象?