2012-03-18 17 views
1

私は過去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 &amp; 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 

答えて

3

ほとんどのモデルの状態が無効です。 Add this extension methodなど、アクションの最初の行にそれを呼び出す:それは後にブレークポイント1行を入れ

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("-----"); 
     } 
    } 
} 
+0

あなたは私にモデルエラーを見つける素晴らしい方法を教えてくれました。それは確かに正しい方向に私を置いてくれました。それは、私がモデルとして使用しようとしている私の 'Entities.OrderDetail'の問題です。そのエンティティは2つのパブリックオブジェクトを保持し、どちらもLinqからSQLオブジェクトです。たぶん私はモデルとしてそれを使用することはできません、POCOオブジェクトを使用する必要がありますか? – CraigKC

0

私は、特にASPを知らないが、あなたがインデックスにカートへのアクセス権を持っているし、B/Cは、明示的にそれを渡している確認するように思えます。あなたがチェックアウトにそれを渡していないので、あなたはそれにアクセスすることができません。私は完全にオフかもしれません

+0

問題はカートオブジェクトにアクセスしていないため、IModelBinderの実装のためにいつでも使用できます。私はnull ** OrderDetail **を取得しています。私はasawyerが右の方向に私を指摘していると思う... – CraigKC

+0

O.そのモデル。 [OK] –

関連する問題