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