Что может привести к сбою привязки модели в ASP.NET MVC 1.0? - PullRequest
0 голосов
/ 01 февраля 2010

Вот мой класс ... какие-нибудь указатели?

public class Cart
{
    private List<CartLine> lines = new List<CartLine>();
    public IList<CartLine> Lines { get { return lines.AsReadOnly(); } }

    public void AddItem(Product product, int quantity)
    {
        var line = lines.FirstOrDefault(l => l.Product.ProductID == product.ProductID);

        if (line == null)
            lines.Add(new CartLine { Product = product, Quantity = quantity });
        else
            line.Quantity += quantity;

    }

    public decimal ComputeTotalValue() 
    {
        return lines.Sum(l => l.Product.Price * l.Quantity);
    }

    public void Clear() 
    {
        lines.Clear();
    }

    public void RemoveLine(Product product)
    {
        lines.RemoveAll(l => l.Product.ProductID == product.ProductID);
    }
}

public class CartLine
{
    public Product Product { get; set;}
    public int Quantity { get; set;}
}

Добавление метода Action в контроллер.

public RedirectToRouteResult AddToCart(Cart cart, int productID, string returnUrl)
        {
            Product product = productsRepository.Products.FirstOrDefault(p => p.ProductID == productID);
            cart.AddItem(product, 1);
            return RedirectToAction("Index", new { returnUrl });
        }

        public RedirectToRouteResult RemoveFromCart(Cart cart, int productID, string returnUrl)
        {
            Product product = productsRepository.Products.FirstOrDefault(p => p.ProductID == productID);
            cart.RemoveLine(product);
            return RedirectToAction("Index", new { returnUrl });
        }

        public ViewResult Index(Cart cart, string returnUrl)
        {
            ViewData["returnUrl"] = returnUrl;
            ViewData["CurrentCategory"] = "Cart";
            return View(cart);
        }

Моя пользовательская модель переплета:

public class CartModelBinder : IModelBinder
    {
        private const string cartSessionKey = "_cart";

        #region IModelBinder Members

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.Model != null)
                throw new InvalidOperationException("Cannot update instances");
            Cart cart = (Cart)controllerContext.HttpContext.Session[cartSessionKey];
            if (cart == null)
            {
                cart = new Cart();
                controllerContext.HttpContext.Session["cartSessionKey"] = cart;
            }
            return cart;
        }
        #endregion
    }

Ответы [ 3 ]

0 голосов
/ 03 февраля 2010

Если вы переопределите связыватель модели, то вы несете ответственность за заполнение объекта из публикации формы. В пользовательской привязке модели, которую вы показываете, вы фактически не устанавливаете свойства корзины. Вам нужно установить его свойства.

0 голосов
/ 04 февраля 2010

Спасибо за все ответы, но я понял проблему. Это очень глупая вещь, на которую указывают форумы ali@asp.net

Проблема заключается в строке controllerContext.HttpContext.Session ["cartSessionKey"] = cart;

Это должен быть просто controllerContext.HttpContext.Session [cartSessionKey] = cart;

Я до сих пор не могу поверить, что не поймал этого раньше.

0 голосов
/ 01 февраля 2010

Первое, что я могу увидеть, не видя метода действия вашего контроллера, это то, что у вас нет свойств, в которые вы можете писать, поэтому предполагается, что этот объект предназначен только для чтения. Как минимум, нам нужно увидеть методы действия контроллера, которые используют этот объект, и, если возможно, представление (я).

UPDATE:

Насколько я понимаю, цель ModelBinder состоит в том, чтобы взять данные, полученные из формы HTML, строки запроса и / или данных сеанса, и заполнить экземпляр класса .NET, и, наоборот, предоставить данные из того же самого экземпляр класса для использования в форме HTML. Из того, что я смотрю, у вашего класса Cart есть поведение и хранилище, но нет переносимых данных в форме свойств чтения / записи. MVC использует .NET отражение, чтобы найти свойства чтения / записи в классе. Поскольку у вас нет свойств для чтения / записи в вашем классе, привязка вашей модели не выполняется, потому что вашему пользовательскому ModelBinder нечего транспортировать.

Возможно, вы захотите взглянуть на эти две статьи для помощи в привязке модели:

http://odetocode.com/Blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx

http://odetocode.com/Blogs/scott/archive/2009/05/05/iterating-on-an-asp-net-mvc-model-binder.aspx

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