【问题标题】:Controller not receiver parameter passed by ajax POST in .Net MVC控制器不是.Net MVC中ajax POST传递的接收器参数
【发布时间】:2015-07-08 11:21:59
【问题描述】:

我想做一个 ajax 购物车,GetCarts 和 AddCart 都可以工作,但是 RemoveRow 不行 接收参数“strms”。当 removeRow(strms) js 函数中的 alert(strms) 显示正确的值 书的 ID(等于 8)。但在 CartController/RemoveRow 调试中,strms 值为 NULL。 我认为这可能是路由的问题,但我认为我的路由配置是正确的! 请帮帮我。

视图是_Layout.cshtml,里面包含js代码 控制器是 CartController

我的 RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Sach", action = "Detail", id = "7" }
        );
        routes.MapRoute(
       "Cart",
       "{controller}/{category}/{ms}/{sl}",
        new { controller = "Cart", action = "AddCart", ms = UrlParameter.Optional, sl = UrlParameter.Optional }
       );
        routes.MapRoute(
     "CartRemoveRow",
     "{controller}/{action}/{ms}",
      new { controller = "Cart", action = "RemoveRow", ms = UrlParameter.Optional });

    }
}

CartController.cs

 public class CartController : Controller
{
    List<CartItem> listCart;
    [HttpPost]
    public ActionResult GetCarts()
    {
        listCart = Cart.getCart(Session);
        return PartialView("Cart", listCart);
    }

    public void AddCart(string ms, string sl) {

        int masach = int.Parse(ms);
        int soluong = int.Parse(sl);
        Cart.AddCart(masach, soluong, Session);
        //return PartialView("Default");
    }
    public void RemoveRow(string strms)
    {
        int ms1 = int.Parse(strms);
        var sach = new Sach() { MaSach = ms1 };
        Cart.removeCart(sach, true);
    }

}

Ajax js 代码

<script type="text/javascript">
    function showCart() {
        // alert("1");
        //Load content from CartController
        $(function () {
            //alert("2");
            $.ajax({
                type: "POST",
                url: '@Url.Action("GetCarts", "Cart")',
                success: function (data) {
                    var result = data;                       
                    $('#myCart').html(result);
                    //alert($('#myCart').html());

                }
            });
        });
        $("#myCart").modal('show');
    }       

    function addCart(ms, sl) {            
        var masach = [];
        masach.push(ms);
        masach.push(sl);            
        // alert(masach);
        $(function () {
            $.ajax({
                type: 'POST',
                url: '@Url.Action("AddCart", "Cart")/'+ms+'/'+ $("#soluong").val(),                    
                success: function (data) {
                    showCart();                        
                }
            });
            return false;
        });         
    }

    function removeRow(strms){          
        $(function () {
           // alert(strms);
            $.ajax({
                type: 'POST',
                url: '@Url.Action("RemoveRow", "Cart")/' + strms,
                success: function (data) {
                    showCart();
                }
            });
        });
    }
</script>

【问题讨论】:

    标签: javascript asp.net-mvc parameters null routes


    【解决方案1】:

    尝试在 data 属性中传递参数,我有多个示例,但现在不在家。

     function removeRow(this_strms){          
        $(function () {
           // alert(strms);
            $.ajax({
                type: 'POST',
                url: '@Url.Action("RemoveRow", "Cart")',
                data: { strms: this_strms},
                success: function (data) {
                    showCart();
                }
            });
        });
    }
    

    我通常将 C# 对象/类作为这样的参数传递

    public void RemoveRow(CartObject strms)
    {
        int ms1 = strms.ms1;
        var sach = new Sach() { MaSach = ms1 };
        Cart.removeCart(sach, true);
    }
    

    在 JS 我做这样的事情

    var thisCartObject= {
      ms1: 1,
      otherproperty: 0.4,
      otherproperty2: "Description"
    };
    
    
     function removeRow(thisCartObject){          
        $(function () {
           // alert(strms);
            $.ajax({
                type: 'POST',
                url: '@Url.Action("RemoveRow", "Cart")',
                data: JSON.stringify({ strms: thisCartObject}),
                contentType: 'application/json',
                dataType: 'json',
                success: function (data) {
                    showCart();
                }
            });
        });
    }
    

    如果你要试试这个,试试不!首先在 RegisterRoutes 类中定义您的自定义路由。

    【讨论】:

      【解决方案2】:

      将 javascript 变量:“strms”重命名为“ms”,然后发送它,因为在您的路线“CartRemoveRow”中,您将收到一个声明为“ms”而不是“strms”的变量。 当然,在您的控制器中,将方法“RemoveRow”中的参数重命名为“ms”。

      或者更简单地说,改变你的路线以接受“strms”:

      routes.MapRoute(
          "CartRemoveRow",
          "{controller}/{action}/{strms}",
          new { controller = "Cart", action = "RemoveRow", strms = UrlParameter.Optional });
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-18
        • 2014-10-14
        • 2016-08-14
        • 1970-01-01
        • 2012-12-04
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多