JsonResult控制器参数始终为null

时间:2014-03-12 02:24:00

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

我在另一个视图和控制器上使用非常相似的代码,但是由于某些原因我无法使用这个代码。无论我做什么,控制器参数都显示未定义,即使javascript中的名称和传递正常工作。任何帮助,将不胜感激!

View:

@using (Html.BeginForm())
{
 <fieldset>
 <legend>User</legend>
       Username:
            @Html.TextBox("txtUsername")
       <br/>
       Password:
            @Html.TextBox("txtPassword")
       <br />
       <p>
            <input type="submit" id="btnLogin" value="Login" />
       </p>
 </fieldset>
 }       

 <script>

 $(function() {
      $("#btnLogin").click(login);
 });

     function login() {
         var name = $('#txtUsername').val();
         var pass = $('#txtPassword').val();

     $.post("/User/Login/" + name + "/" + pass, null, loginSuccess, "json");
}

function loginSuccess(result) {
    alert(result);
}

</script>


Controller:

public ActionResult Login()
{
    return View("Login");
}

[HttpPost]
public JsonResult Login(string name, string pass)
{
    string result = "test result";

    return Json(result);
}

6 个答案:

答案 0 :(得分:3)

你需要的只是:

View:

@using (Html.BeginForm())
{
 <fieldset>
 <legend>User</legend>
   Username:
        @Html.TextBox("txtUsername")
   <br/>
   Password:
        @Html.TextBox("txtPassword")
   <br />
   <p>
        <input type="button" id="btnLogin" value="Login" />
   </p>
 </fieldset>
 }      

然后是控制器:

Controller:

public ActionResult Login()
{
    return View("Login");
}

[HttpPost]
public JsonResult Login(string name, string pass)
{
    string result = "test result";

    return Json(result);
}

ajax部分:

<script type="text/javascript">
$( "#btnLogin" ).click(function() {


$.ajax({
                url: "@Url.Action("YourControllerActionName", "YourControllerName")",
                type: 'POST',
                data: {
                    name: $('#txtUsername').val(),
                    pass: $('#txtPassword').val()
                },
                success: function(result) {
                      alert(result); 
                }
            });
});
<script>

答案 1 :(得分:2)

您可以按照自己的方式进行,但我也需要查看您的路线。有一种更好的方式来进行这个电话。

var data = {
    "name": $('#txtUsername').val(),
    "pass": $('#txtPassword').val()
};

$.post('@Url.Action("Login", "Home")', data, function(response) {
   //Do something with the response if you like
});

答案 2 :(得分:2)

我不喜欢字符串连接和硬编码字符串。

首先,让我们使用HTML帮助程序来解析操作的网址。

@Url.Action("Login", "User")

其次,让我们将数据作为javascript对象传递。

$.post("@Url.Action("Login", "User")",
    {
        name: name,
        pass: pass
    }, loginSuccess, "application/json");

答案 3 :(得分:2)

你发送参数作为URL的一部分(因此,有效地,无论jquery $ .post()如何都使其GET)并且你的控制器严格要求HttpPost(意思是http请求体中的参数,而不是查询字符串中的参数)

不要理会在网址中使用用户名/密码是非常糟糕的做法。

尝试将数据发送为:

$ .post('url / of / the / controller',{name:$('#txtUsername')。val(),pass:$('#txtPassword')。val()});

答案 4 :(得分:1)

您正在调用控制器操作方法错误。尝试将namepass作为$.post调用中的数据传递,而不是附加到网址上。

使控制器操作方法采用LogIn类型的模型也可能更清晰。 LogIn可以有两个属性(NamePass)。这样,当您在$.post中发送数据时 你可以像{ name: 'someName', pass: 'somePass' }一样发送它。

答案 5 :(得分:1)

您可以将其发布为::

    $.ajax({
           type:'POST',
           url:"User/Login",
           data:{UserName:$("#UserName").val(),Password:$("#Password").val()},
           success:function(data){
               alert(data);
           }
    })

在服务器端,您将获得类似::

的信息
[HttpPost]
public JsonResult Login(string Username, string Password)
{
    string result = "test result";

    return Json(result);
}