从jquery将多个参数传递给mvc控制器

时间:2014-09-02 12:37:52

标签: jquery asp.net-mvc

我正在尝试将几个参数从jquery传递给mvc控制器,但该方法正在接收空值,即使调试器显示浏览器调试器中的两个控件的val()都存在。

$(function () {
    $('#Counties').cascade({
        data: JSON.stringify('{state: ' +  $("#States").val() + ', county: ' + $("#Counties").val() + '}'),
        url: '@Url.Action("GetCities")',
        childSelect: $('#Cities')
    });
});

enter image description here

我在下面的答案中尝试了两种方法,一种是使用JSON.stringify而不是。这些值仍然是null

enter image description here

这是更新的代码。我在另一篇文章中读到,我可能需要为该方法编写一个Route。我补充说,但这不起作用

$(function () {
    $('#Counties').cascade({
        data: {state: $("#States").val(), county: $("#Counties").val()},
        url: '@Url.Action("GetCities")',
        childSelect: $('#Cities')
    });
});


[HttpGet]
public ActionResult GetCities(string state, string county)
{
    var cities = _carrierRouteAssignmentRepository.GetCities(state, county);
    return Json(cities, JsonRequestBehavior.AllowGet);
}

routes.MapRoute(
    name: "GetCities",
    url: "{controller}/{action}/{state}/{county}",
    defaults: new { controller = "CarrierRouteAssignments", action = "GetCities", state = UrlParameter.Optional, county = UrlParameter.Optional }
    ); 

运行fiddler我看到请求以

的形式出现
/CarrierRouteAssignments/GetCities?undefined=LOS+ANGELES 

哪个不正确

3 个答案:

答案 0 :(得分:1)

您应该将对象传递给JSON.stringify()方法,目前您正在传递字符串

使用

data: JSON.stringify({
    state: $("#States").val() , 
    county: $("#Counties").val() 
}),

而不是

data: JSON.stringify('{state: ' +  $("#States").val() + ', county: ' + $("#Counties").val() + '}'),

答案 1 :(得分:0)

尝试以下

$(function () {
    $('#Counties').cascade({
         data:{ state: $("#States").val() ,  county: $("#Counties").val() },
        url: '@Url.Action("GetCities")',
        childSelect: $('#Cities')
    });
});

答案 2 :(得分:0)

我刚刚意识到问题所在。我正在使用此post中的辅助方法,并没有查找问题。我也没有在原来的问题中发布这个。正如您将注意到,辅助方法只需要1个参数,这是传递给帮助程序的参数。我要么必须扩展这个帮助器,要么绕过最后一个下拉列表级联。感谢所有的投入。它确实解决了一个问题。

(function ($) {
    $.fn.cascade = function (options) {
        var defaults = {};
        var opts = $.extend(defaults, options);

        return this.each(function () {
            $(this).change(function () {
                var selectedValue = $(this).val();
                var params = {};
                params[opts.paramName] = selectedValue;
                $.getJSON(opts.url, params, function (items) {
                    opts.childSelect.empty();
                    $.each(items, function (index, item) {
                        opts.childSelect.append(
                        $('<option/>')
                            .attr('value', item)
                            .text(item)
                    );
                    });
                });
            });
        });
    };
})(jQuery);