如何从ajax传递多个参数到mvc控制器?

21

控制器

[HttpPost]
public ActionResult Save(string StrContactDetails, bool IsPrimary)
{
}

$.ajax({
  async: true,
  type: "POST",
  url: @url.Action("Helper","Save"),
  data: {
    StrContactDetails: Details,
    IsPrimary: true
  },
  //data: "StrContactDetails=" + Details + "&IsPrimary=" + true,
  //data: "{StrContactDetails:'" + Details + "',IsPrimary:"+ true + "}",
  //contentType: "application/json; charset=utf-8",
  success: function() {
  },
  error: function() {
  }
});

当我的操作方法只需要一个参数时,我可以通过ajax传递单个参数来使用它。但是,如果它需要两个参数,我就无法调用它。因此,在传递参数方面出现了一些问题。可能是内容类型的问题。

routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Default", action = "Login", id = UrlParameter.Optional }
).DataTokens = new RouteValueDictionary(new { area = "MyArea" });

当我的操作方法如下时,我可以调用.../TestProj/MyArea/Helper/Save/StrContactDetails="Test"

public ActionResult Save(string StrContactDetails)
{
  return Content("called");         
}

如果我的操作方法如下,我可以调用.../TestProj/MyArea/Helper/SaveEmergencyContact/StrContactDetails="test"?IsPrimary=true。但是当我把 ? 替换成 / 后,即变成.../TestProj/MyArea/Helper/SaveEmergencyContact/StrContactDetails="test"/IsPrimary=true,返回 404 错误。

public ActionResult Save(string StrContactDetails, bool IsPrimary)
{
  return Content("called");         
}

我这里缺少什么?对于带有两个参数的 AJAX 调用,我需要更改路由配置吗?


1
将其更改为 data: { StrContactDetails: '详细信息',IsPrimary: 'true' }(或使用 JSON.stringify())。 - user3559349
它是否触发了您的操作方法,但提供了“null”参数? - Mathew Thompson
不,它没有触发Action方法。 - Rasmita Dash
1
你发布到了 /SaveEmergencyContact/Dhp!如果你有 DhpController,请将其更改为 url: '@url.Action("SaveEmergencyContact","Dhp")', - user3559349
1
你通过最新的编辑完全改变了问题,使之前的评论和答案毫无意义(调用那些 URL 与从 ajax 传递多个参数到控制器有什么关系?你应该提出一个新问题!但是,是的,你确实需要一个特定的路由来使第二个示例起作用。) - user3559349
显示剩余3条评论
6个回答

30

我认为你可能需要使用JSON.stringify将数据转换为字符串。

 var data = JSON.stringify({ 
                 'StrContactDetails': Details,
                 'IsPrimary':true
               });

$.ajax({
        type: "POST",
        url: @url.Action("Dhp","SaveEmergencyContact"),
        data: data,
        success: function(){},
        contentType: 'application/json'
    });

所以控制器方法应该是这样的:

public ActionResult SaveEmergencyContact(string  StrContactDetails, bool IsPrimary)

这个答案恰好是当你需要传递模型时的解决方案。 - Rush.2707
对我来说它运行良好。在以下代码上: $.ajax({ type: 'POST', url: '/hr/employee/assigncustomer', data: JSON.stringify({ 'employeeCustomerId': contactId, 'customerIds': customerIds }), dataType: 'json', contentType: 'application/json; charset=utf-8', success: function (data) {}}) - Rejwanul Reja

16

你可以通过不初始化url并像这样硬编码来实现它

//var url = '@Url.Action("ActionName", "Controller");

$.post("/Controller/ActionName?para1=" + data + "&para2=" + data2, function (result) {
        $("#" + data).html(result);
        ............. Your code
    });

您的控制器端代码必须像下面这样:

public ActionResult ActionName(string para1, string para2)
{
   Your Code .......
}

这是简单的方法。现在我们也可以通过 JSON 传递多个数据,像这样:

var val1= $('#btn1').val();  
var val2= $('#btn2').val(); 
$.ajax({
                    type: "GET",
                    url: '@Url.Action("Actionre", "Contr")',
                    contentType: "application/json; charset=utf-8",
                    data: { 'para1': val1, 'para2': val2 },
                    dataType: "json",
                    success: function (cities) {
                        ur code.....
                    }
                });

尽管您的控制器端代码将保持不变:

public ActionResult ActionName(string para1, string para2)
{
   Your Code .......
}

3

请尝试以下操作:

function X (id,parameter1,parameter2,...) {
    $.ajax({

            url: '@Url.Action("Actionre", "controller")',+ id,
            type: "Get",
            data: { parameter1: parameter1, parameter2: parameter2,...}

    }).done(function(result) {

        your code...
    });
}

所以控制器方法将如下所示:

public ActionResult ActionName(id,parameter1, parameter2,...)
{
   Your Code .......
}

1

试试这个:

var req={StrContactDetails:'data',IsPrimary:'True'}

$.ajax({
                   type: 'POST',
                   data: req,
                   url: '@url.Action("SaveEmergencyContact","Dhp")',
                   contentType: "application/json; charset=utf-8",
                   dataType: "json",
                   data: JSON.stringify(req),
                   success: function (data) {
                       alert("Success");
                   },
                   error: function (ob, errStr) {
                       alert("An error occured.Please try after sometime.");
                   }
               });

http://api.jquery.com/jquery.ajax/


2
使用stringify将其传递给asp.net mvc4控制器没有起作用,但是不调用stringify就可以传递。我注意到当控制器参数是对象而不是常规原始数据类型时,stringify的效果很好。 - eaglei22

1
  var data = JSON.stringify
            ({
            'StrContactDetails': Details,
            'IsPrimary': true
            })

7
请在您的回答中添加一些解释。 - Lucifer

0
function toggleCheck(employeeId) {
    var data =  'referenceid= '+ employeeId +'&referencestatus=' 1;
    console.log(data);
    $.ajax({
        type : 'POST',
        url : 'edit',
        data : data,
        cache: false,
        async : false,
        success : function(employeeId) {
            alert("Success");
            window.redirect = "Users.jsp";
        }
    });

}

为什么async:false?这被广泛认为是一种不良实践,在此代码中根本不必要。此外,带有解释的答案往往具有更高的质量。 - ADyson
绝对正确的异步不需要编写,如果你想用就用,否则不用异步,但是我想使用上述代码在我的控制器中传递2个参数,我成功了。 - raju ranjan
1
好的,但为什么要随意包含一些不良实践,当它对于这个目的是不必要的呢?特别是因为您仍然没有添加任何关于您所做的工作与问题中的内容相比,使代码工作的解释,有人可能会认为这是解决方案的必要部分。 - ADyson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接