【问题标题】:MVC ajax post to controller action methodMVC ajax 发布到控制器操作方法
【发布时间】:2013-10-29 16:19:00
【问题描述】:

我一直在这里查看问题:MVC ajax json post to controller action method 但不幸的是,它似乎对我没有帮助。我的几乎完全一样,除了我的方法签名(但我已经尝试过了,它仍然没有被击中)。

jQuery

​​>
$('#loginBtn').click(function(e) {
    e.preventDefault();

    // TODO: Validate input

    var data = {
        username: $('#username').val().trim(),
        password: $('#password').val()
    };

    $.ajax({
        type: "POST",
        url: "http://localhost:50061/checkin/app/login",
        content: "application/json; charset=utf-8",
        dataType: "json",
        data: JSON.stringify(data),
        success: function(d) {
            if (d.success == true)
                window.location = "index.html";
            else {}
        },
        error: function (xhr, textStatus, errorThrown) {
            // TODO: Show error
        }
    });
});

控制器

[HttpPost]
[AllowAnonymous]
public JsonResult Login(string username, string password)
{
    string error = "";
    if (!WebSecurity.IsAccountLockedOut(username, 3, 60 * 60))
    {
        if (WebSecurity.Login(username, password))
            return Json("'Success':'true'");
        error = "The user name or password provided is incorrect.";
    }
    else
        error = "Too many failed login attempts. Please try again later.";

    return Json(String.Format("'Success':'false','Error':'{0}'", error));
}

但是,无论我尝试什么,我的Controller 都不会被击中。通过调试,我知道它发送了一个请求,只是每次都得到一个Not Found的错误。

【问题讨论】:

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


    【解决方案1】:

    您的 Action 需要字符串参数,但您发送的是复合对象。

    您需要创建一个与您发送的内容相匹配的对象。

    public class Data
    {
        public string username { get;set; }
        public string password { get;set; }
    }
    
    public JsonResult Login(Data data)
    {
    }
    

    编辑

    另外,这里的 toStringify() 可能不是你想要的。只需发送对象本身。

    data: data,
    

    【讨论】:

      【解决方案2】:

      这是由于您发送了一个对象,而您需要两个参数。

      试试这个,你会看到:

      public class UserDetails
      {
         public string username { get; set; }
         public string password { get; set; }
      }
      
      public JsonResult Login(UserDetails data)
      {
         string error = "";
         //the rest of your code
      }
      

      【讨论】:

      【解决方案3】:

      试试这个:

      /////// Controller post and get simple text value 
      [HttpPost]
          public string Contact(string message)
          { 
              return "<h1>Hi,</h1>we got your message, <br />" + message + " <br />Thanks a lot";
          }
      

      //// 在视图中添加对 Javascript (jQuery) 文件的引用

      @section Scripts{
      
      <script src="~/Scripts/modernizr-2.6.2.js"></script>
      <script src="~/Scripts/jquery-1.8.2.intellisense.js"></script>
      <script src="~/Scripts/jquery-1.8.2.js"></script>
      <script src="~/Scripts/jquery-1.8.2.min.js"></script>  
      }
      

      /// 然后添加 Post 方法如下:

      <script type="text/javascript"> 
      
      /// post and get text value
          
      $("#send").on("click", function () {    
      $.post('', { message: $('#msg').val() })  
      
      //// empty post('') means post to the default controller, 
      ///we are not pacifying different action or controller
      /// however we can define a url as following:
      /// var url = "@(Url.Action("GetDataAction", "GetDataController"))"
      
               .done(function (response) {
                   $("#myform").html(response);
              })
              .error(function () { alert('Error') })
              .success(function () { alert('OK') })
              return false;
          }); 
      

      现在假设您想使用 $.Ajax 和 JSON 来实现:

      // Post JSON data  add using System.Net;
          [HttpPost]
          public JsonResult JsonFullName(string fname, string lastname)
          {
              var data = "{ \"fname\" : \"" + fname  + " \" , \"lastname\" : \"" + lastname + "\" }";
      //// you have to add the JsonRequestBehavior.AllowGet 
       //// otherwise it will throw an exception on run-time.
              return Json(data, JsonRequestBehavior.AllowGet);  
          }
      

      然后,在您的视图中:添加事件单击输入类型按钮,甚至是来自提交: 只需确保您的 JSON 数据格式正确。

        $("#jsonGetfullname").on("click", function () { 
              $.ajax({
                  type: "POST",
                  contentType: "application/json; charset=utf-8",
                  url: "@(Url.Action("JsonFullName", "Home"))",
                  data: "{ \"fname\" : \"Mahmoud\" , \"lastname\" : \"Sayed\" }",
                  dataType: "json",
                  success: function (data) {
                      var res = $.parseJSON(data);
                      $("#myform").html("<h3>Json data: <h3>" + res.fname + ", " + res.lastname)
                  }, 
                  error: function (xhr, err) {
                      alert("readyState: " + xhr.readyState + "\nstatus: " + xhr.status);
                      alert("responseText: " + xhr.responseText);
                  } 
              })
          });
      

      【讨论】:

        【解决方案4】:

        我发现这种使用 ajax 的方式对我有帮助,因为它没有复杂的 json 语法,使用起来更好

        //fifth
        function GetAjaxDataPromise(url, postData) {
            debugger;
            var promise = $.post(url, postData, function (promise, status) {
            });
            return promise;
        };
        $(function () {
            $("#btnGet5").click(function () {
                debugger;
                var promises = GetAjaxDataPromise('@Url.Action("AjaxMethod", "Home")', { EmpId: $("#txtId").val(), EmpName: $("#txtName").val(), EmpSalary: $("#txtSalary").val() });
                promises.done(function (response) {
                    debugger;
                    alert("Hello: " + response.EmpName + " Your Employee Id Is: " + response.EmpId + "And Your Salary Is: " + response.EmpSalary);
                });
            });
        });
        

        这个方法带有 jquery 承诺,最好的部分是在控制器上,我们可以通过使用单独的参数或仅使用模型类来接收数据。

        [HttpPost]
            public JsonResult AjaxMethod(PersonModel personModel)
            {
                PersonModel person = new PersonModel
                {
                    EmpId = personModel.EmpId,
                    EmpName = personModel.EmpName,
                    EmpSalary = personModel.EmpSalary
                };
                return Json(person);
            }
        

        [HttpPost]
            public JsonResult AjaxMethod(string empId, string empName, string empSalary)
            {
                PersonModel person = new PersonModel
                {
                    EmpId = empId,
                    EmpName = empName,
                    EmpSalary = empSalary
                };
                return Json(person);
            } 
        

        这两种情况都适用。所以你必须尝试这种方式。从Using Ajax With Asp.Net MVC得到参考

        除了这个你必须尝试的方法之外,还有其他几种使用 Ajax 的方法。

        【讨论】:

          【解决方案5】:
          $('#loginBtn').click(function(e) {
              e.preventDefault(); /// it should not have this code or else it wont continue
              //....
          });
          

          【讨论】:

          • 这完全不正确。 e.preventDefault() 不会停止单击处理程序的执行。它可以防止发生 默认 操作,例如提交表单、导航到另一个页面等。
          猜你喜欢
          • 2011-05-06
          • 2019-03-30
          • 2019-01-26
          • 1970-01-01
          • 2013-08-10
          • 2016-05-28
          • 2014-04-04
          • 2017-07-20
          • 1970-01-01
          相关资源
          最近更新 更多