私は過去2週間でMVC 3を急速に学習してきましたが、何時間も検索を解決できなかったことがあります。私はシンプルなショッピングカートを開発しており、チェックアウトプロセスを通じて直線的な経路でデータを渡そうとしています。私は何を試しても、次のビューにPOSTするモデルを手に入れることができませんでした。POSTモデルからコントローラへのメソッド
まず、「Cart」エンティティは、IModelBinderの実装を使用してSessionから取得されています。それは本質的にどんな方法でも利用可能です。それはしばらくの間素晴らしい仕事をしてきました。私の問題は、/ cart/confirmと/ cart/checkoutの間で同じモデルを渡そうとしていることです。
/cart/checkoutのコントローラで、モデルが常に空である理由を理解できますか? /Views/Cart/Index.aspxはこのようになります
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.
}
}
(申し訳ありませんが、カミソリは):
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site-1-Panel.Master" Inherits="System.Web.Mvc.ViewPage<My.Namespace.Entities.Cart>" %>
...
...
<% using(Html.BeginForm("confirm", "cart")) { %>
Not much to see here, just a table with the cart line items
<input type="submit" value="Check Out" />
<% } %>
私はこの問題はここにある疑いがあるが、私は、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" />
<% } %>
そして最後に/Views/Cart/Checkout.aspxは、次のようになります
<%@ 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
あなたは私にモデルエラーを見つける素晴らしい方法を教えてくれました。それは確かに正しい方向に私を置いてくれました。それは、私がモデルとして使用しようとしている私の 'Entities.OrderDetail'の問題です。そのエンティティは2つのパブリックオブジェクトを保持し、どちらもLinqからSQLオブジェクトです。たぶん私はモデルとしてそれを使用することはできません、POCOオブジェクトを使用する必要がありますか? – CraigKC