Модель POST для метода контроллера - PullRequest
1 голос
/ 18 марта 2012

За последние пару недель я быстро изучал MVC 3, но что-то случилось, и я просто не мог решить проблему с поиском в течение нескольких часов. Я разрабатываю простую корзину для покупок и пытаюсь передать данные линейным путем в процессе оформления заказа. Мне не удалось вывести модель на POST для следующего просмотра, что бы я ни пытался.

Для начала сущность 'Cart' извлекается из Session с использованием реализации IModelBinder. Это по существу доступно для любого метода. Некоторое время он работал отлично. Моя проблема пытается передать ту же модель между / корзина / подтвердить и / корзина / оформить заказ.

Может кто-нибудь помочь выяснить, почему модель всегда пуста в контроллере для / 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.
}

}

/ Просмотры / Корзина / Index.aspx выглядит так (извините, нет бритвы):

<%@ 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

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Скорее всего, ваше состояние модели недействительно. Добавьте этот метод расширения и вызовите его в первой строке действия, например:

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 голосов
/ 18 марта 2012

Я не знаю asp конкретно, но похоже, что у вас есть доступ к корзине в индексе и подтверждаю, что вы передаете ее явно. Поскольку вы не передаете его в кассу, вы не сможете получить к нему доступ. Я мог бы быть полностью выключен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...