2 u010220872 u010220872 于 2014.07.03 23:27 提问

MVC模型绑定遇到的问题

在实现购物车时,我的其他功能都可以正常运行,只有更新购物车数量这个功能中Carts绑定不到
视图代码:

@model IEnumerable<MVCShopping.Models.Cart>
@{
    var ajaxOption = new AjaxOptions()
    {
        OnSuccess = "RemoveCartSuccess",
        OnFailure = "RemoveCartFailure",
        Confirm = "您确定要从购物车删除吗?",
        HttpMethod = "Post",
    };
}
@section scripts{
    @Scripts.Render("~/bundles/jqueryval")
    <script>
        function RemoveCartSuccess() {
            alert('移出购物从成功');
            location.reload();
        }
        function RemoveCartFailure(xhr)
        {
            alert('移出购物车失败(Http状态代吗:' + xhr.status);
        }
    </script>
    }

<h2>购物车列表</h2>
@using (Html.BeginForm("UpdateAmount", "Cart"))
{ 
    <table>
        <tr>
            <th>产品名称</th>
            <th>单价</th>
            <th>数量</th>
            <th>小计</th>
            <th></th>
        </tr>
        @{int subTotal = 0;}
        @foreach (var item in Model)
        {
            subTotal += item.Product.Price * item.Amount;
            var ddlAmountList = new SelectList(Enumerable.Range(1,10),item.Amount);
            @Html.Hidden(item.Product.Id.ToString())
            <tr>
                <td>@Html.DisplayFor(t=>item.Product.Name)</td>
                <td>NT¥@(item.Product.Price)</td>
                <td>@Html.DropDownListFor(t=>item.Amount,ddlAmountList)</td>
                <td>NT¥@(item.Product.Price*item.Amount)</td>
                <td>
                    @Ajax.ActionLink("删除","Remove",new{ProductId=item.Product.Id},ajaxOption)
                </td>
            </tr>
        }
        <tr>
            <th></th>
            <th></th>
            <th>总价</th>
            <th id="subtotal">NT¥ @subTotal</th>
            <th></th>
        </tr>
    </table>
    <p>
        <input type="submit" value="更新数量" />
        <input type="button" value="完成订单" onclick="location.href='@Url.Action("Complete","Order")';" />
    </p>
}

控制器CartControl代码:

 public class CartController : Controller
{
    //非会员也可使用所以购物车保存在Session中
    // 显示当前购物从项目
    MvcShoppingContext db = new MvcShoppingContext();
    List<Cart> Carts
    {
        get {
            if (Session["Carts"] == null)
            {
                Session["Carts"] = new List<Cart>();
            }
            return Session["Carts"] as List<Cart>;
        }
        set { Session["Carts"] = value; }
    }
    public ActionResult Index()
    {
        return View(this.Carts);
    }
    //添加产品项目到购物车,如果没有传入Amount参数则默认购买数量为1
    //因为要通过Ajax调用这个Action,所以可以先标示Post属性
    [HttpPost]
    public ActionResult AddToCart(int ProductId, int Amount = 1)
    {
        var product = db.Products.Find(ProductId);
        //验证产品是否存在
        if (product == null)
            return HttpNotFound();
        var existiongCart = this.Carts.FirstOrDefault(p => p.Product.Id == ProductId);
        if (existiongCart != null)
        {
            existiongCart.Amount += 1;
        }
        else
        {
            this.Carts.Add(new Cart() { Product=product,Amount=Amount});
        }
        return new HttpStatusCodeResult(HttpStatusCode.Created);
    }
    //移出购物从项目
    [HttpPost]
    public ActionResult Remove(int ProductId)
    {
        var existingCart = this.Carts.FirstOrDefault(p => p.Product.Id == ProductId);
        if (existingCart != null)
        {
            this.Carts.Remove(existingCart);
        }
        return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK);
    }
    //更新数量
    [HttpPost]
    public ActionResult UpdateAmount(IEnumerable<Cart> Carts)
    {
        foreach (var item in Carts)
        {
            var existingCart = this.Carts.FirstOrDefault(p => p.Product.Id == item.Product.Id);
            if (existingCart != null)
            {
                existingCart.Amount = item.Amount;
            }
        }
        return RedirectToAction("Index","Cart");
    }
}

就是最后一个更新数量的方法( public ActionResult UpdateAmount(IEnumerable Carts) )上Carts一直为空绑定不到。这是哪里出了问题呢?

2个回答

zhouchuansong
zhouchuansong   2015.09.23 07:53

@{int subTotal = 0;}
@for (int i = 0; i < Model.Count; i++)
{
subTotal += Model[i].Product.Price * Model[i].Amount;
var ddlAmountList = new SelectList(Enumerable.Range(1, 10), Model[i].Amount);
@Html.HiddenFor(modelItem => modelItem[i].Product.Id)


@Html.DisplayFor(modelItem => Model[i].Product.Name)


¥@(Model[i].Product.Price)

@Html.DropDownListFor(modelItem => Model[i].Amount, ddlAmountList)


@(Model[i].Product.Price * Model[i].Amount)元

@Ajax.ActionLink("删除", "Remove", new { ProductId = Model[i].Product.Id }, ajaxOption)


}
这是我参照数上写的代码,运行正常~你可以参考下!
sinat_31879383
sinat_31879383   2015.10.09 17:57

请问最终你解决了么?update amount获取到了list结果么?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
ASP.NET MVC Model Binding(模型绑定)
转载出处: http://www.cnblogs.com/willick/p/3424188.html [ASP.NET MVC 小牛之路]15 - Model Binding Model Binding(模型绑定)是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程。我们之前所有示例中传递给 Action 方法参数的对象都是在 Model Bi
MVC学习笔记六:模型绑定【上】
模型绑定 这一章主要记录一下MVC模型绑定 一.认识模型绑定 官方的详细介绍模型绑定的资料我没找到,只是在MSDN上讲DefaultModelBinder 类时介绍了一下:将浏览器请求映射到数据对象。 这句话刚看上去也不大明白意思,用自己的话总结一下: 模型绑定实际上是: 服务器端代码利用用户在表单中输入的数据(或其它HTTP请求携带的数据),来构造动作方法所需要的参数
MVC 传递复杂类型绑定模型
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Script.Serialization; using System.IO; using Newtonsoft.Json; na
MVC 框架-Model Binding(模型绑定)批量修改增加记录
Model Binding(模型绑定)是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程。我们之前所有示例中传递给 Action 方法参数的对象都是在 Model Binding 中创建的。本文将介绍 Model Binding 如何工作,及如何使用 Model Binding,最后将演示如何自定义一个 Model Binding 以满足一些高级的需求。 本文目录
ASP.NET MVC 视图与模型绑定
在ASP.NET MVC 中视图与模型是可以直接绑定的,这样就绕过了Controller。这种应用场景主要是做信息的提交,比如用户的注册,订单的提交等等。在蒋金楠的《ASP.NET MVC 5框架揭秘》中,他提出MVC视图与模型直接绑定容易带来“混乱”,建议在开发过程中对视图,模型及控制器的交互做好约定,或者使用MVP模式。MVP模式杜绝了视图与模型的直接交互,从根本上解决这个问题。今天我写了一个
net MVC中的模型绑定、验证以及ModelState
模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。 比如要创建用户,在form表单中填写用户名密码,在controller中直接使用User类接收就行了: public ActionResult Create(User user){ var name=user.Name; var pwd=...
理解ASP.NET MVC中的模型绑定
模型绑定的本质     任何控制器方法的执行都受action invoker组件(下文用invoker代替)控制。对于每个Action方法的参数,这个invoker组件都会获取一个Model Binder Object(模型绑定器对象)。Model Binder的职责包括为Action方法参数寻找一个可能的值(从HTTP请求上下文)。每个参数都可以绑定到不同的Model Binder;但是大部分
ASP.NET MVC模型绑定——绑定部分字段
using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace Xautjzd.Models { [Bind(Exc
ASP.NET Core MVC 模型绑定用法及原理
前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC 中模型绑定是如何实现的,以及它的一些其他用法。 模型绑定的用途 通常情况下,我们在使用 MVC 框架的时候不需要关注模型绑定的相关功能,因为它是集成到 MVC 框架内部的,当我们在浏览器访问一个
C# MVC模型绑定和自定义绑定(详细介绍)
//系统自带绑定    //Bind特性有三个属性,Include=&quot;包含字段&quot;;Prefix=&quot;含有字符串的字段&quot;;Exclude=&quot;不包含的字段&quot;     public class UsersController : Controller     {         //可写在参数中         public ActionResult usersBind([Bind(Include ...