【问题标题】:How to pass multiple parameters from ajax to mvc controller?如何将多个参数从 ajax 传递到 mvc 控制器?
【发布时间】:2015-04-03 16:18:56
【问题描述】:

控制器

[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。但我得到了 404 .../TestProj/MyArea/Helper/SaveEmergencyContact/StrContactDetails="test"/IsPrimary=true(将 ? 替换为 /)

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

我在这里缺少什么?我需要为 2 个参数的 ajax 调用更改路由配置吗?

【问题讨论】:

  • 改成data: { StrContactDetails: 'Details', IsPrimary: 'true' },(或使用JSON.stingfy()
  • 是否命中了你的action方法,但提供了null参数?
  • 不,它没有击中 Action 方法
  • 您发帖到/SaveEmergencyContact/Dhp!假设您有DhpController,请将其更改为url: '@url.Action("SaveEmergencyContact","Dhp")',
  • 你已经用最新的编辑完全改变了你的问题,使得以前的 cmets 和答案毫无意义(调用这些 url 与 将多个参数从 ajax 传递到控制器 ? 你应该问一个新问题!但是,是的,你确实需要一个特定的路线来使第二个示例工作。

标签: jquery asp.net-mvc asp.net-ajax


【解决方案1】:

我认为您可能需要使用 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)

【讨论】:

  • 这个答案正是你需要通过模型的时候
  • 一切正常。对我来说: $.ajax({ type: 'POST', url: '/hr/employee/assigncustomer', data: JSON.stringify({ 'employeeCustomerId': contactId, 'customerIds': customerIds }), dataType: ' json', contentType: 'application/json; charset=utf-8', 成功: function (data) {}}) 谢谢
【解决方案2】:

你可以通过不初始化 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 .......
    }
    

    【讨论】:

      【解决方案4】:

      试试这个:

      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/

      【讨论】:

      • 使用 stringify 无法使用 asp.net mvc4 将其传递给控制器​​。但是在不调用 stringify 的情况下传递它。我注意到当控制器参数是对象而不是常规原始数据类型时,stringify 效果很好。
      【解决方案5】:
        var data = JSON.stringify
                  ({
                  'StrContactDetails': Details,
                  'IsPrimary': true
                  })
      

      【讨论】:

      • 请在您的回答中添加一些解释。
      【解决方案6】:
      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";
              }
          });
      
      }
      

      【讨论】:

      • 为什么异步:假?众所周知,这是一种不好的做法,并且在此代码中根本没有必要。此外,带有解释的答案往往质量更高。
      • 绝对正确的异步不需要写,如果你想使用,否则不要使用异步,但我想使用上面的代码在我的控制器中传递2个参数我成功了。
      • 好的,但是为什么在不必要的情况下随机包含一些不好的做法呢?特别是由于与问题中的内容相比,您仍然没有添加任何解释来说明您为使代码工作所做的工作,因此有人可能认为这是解决方案的必要部分。
      猜你喜欢
      • 2013-12-10
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多