【问题标题】:JsonResult controller parameter always nullJsonResult 控制器参数始终为空
【发布时间】:2014-03-12 02:23:59
【问题描述】:

我在另一个运行良好的视图和控制器上使用了极其相似的代码,但由于某种原因,我无法让这个运行。无论我做什么,控制器参数都显示未定义,即使名称和传入的 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);
}

【问题讨论】:

  • 你会发布你的控制器操作方法吗?

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


【解决方案1】:

你只需要:

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>

【讨论】:

  • 如果 OP 确实需要异步完成并且无需重新加载页面,则情况并非如此。您最好询问 OP(在评论中)为什么要使用特定方法。使用这种方法,回调函数loginSuccess 将永远不会被调用。
  • 是的,也许我应该添加另一个 ajax 方法。编辑答案。
  • 使用您的确切 ajax 代码我仍然得到空值。我显然在没有 ajax 的情况下添加了控制器名称等,但是是的,我希望它是一个 ajax/json 调用。我完全困惑
  • 尝试将按钮输入类型改为type="button"
  • 就是这样!谢谢你。请编辑您的答案以包括在内,我会标记您的
【解决方案2】:

您将参数作为 URL 的一部分发送(因此,有效地使其 GET 与 jquery $.post() 无关)并且您的控制器严格期望 HttpPost(意思是,http 请求正文中的参数,而不是查询字符串中的参数) .

撇开在 url 中包含用户名/密码是非常糟糕的做法这一事实不谈。

尝试发送数据为:

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

【讨论】:

    【解决方案3】:

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

    首先,让我们使用 HTML 帮助器来解析操作的 URL。

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

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

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

    【讨论】:

    • 看起来不错,但在这个逗号“用户”上出现语法错误),
    • 这只是 HTML 解析器在抱怨,因为根据它,( 和 , 之间没有任何内容,因为它忽略了 Razor 语法。这是相当标准的。您可以忽略它或直接将其更改为$.post("@Url.Action("Login", "User")",。
    • 知道了,json 结果中的参数仍然为空。
    • 不行... $(function() { $("#btnLogin").click(login); }); function login() { var name = $('#txtUsername').val(); var pass = $('#txtPassword').val(); $.post(@Url.Action("Login", "User"), { name: name, pass: pass }, loginSuccess, "application/json"); } 函数 loginSuccess() { };
    • 不管我做什么用户名和密码都是空的
    【解决方案4】:

    您也许可以按照自己的方式进行操作,但我也需要查看您的路线。不过,有一个更好的方法可以进行此调用。

    var data = {
        "name": $('#txtUsername').val(),
        "pass": $('#txtPassword').val()
    };
    
    $.post('@Url.Action("Login", "Home")', data, function(response) {
       //Do something with the response if you like
    });
    

    【讨论】:

    • 第 3 行的 var 是否输入错误?
    • 控制器名称后面的逗号也出现语法错误
    • 是的,很抱歉出现复制粘贴错误。 @UrlAction 也需要用我最初省略的引号括起来。我已经进行了更新。
    【解决方案5】:

    您错误地调用了您的控制器操作方法。尝试在 $.post 调用中将 name 和 pass 作为数据传递,而不是附加到 url。

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

    【讨论】:

    • "您错误地调用了您的控制器操作方法。尝试在 $.post 调用中传递名称并作为数据传递,而不是附加到 url。"谢谢!你能举个例子吗?
    • @osiris355 什么?编辑:好的,看看这个:stackoverflow.com/a/19663938/1165441 所以你的帖子是$.post("/User/Login/", { name: "someName", pass: "somePass" } );
    • 我是 mvc 和 json 的新手。你能展示我如何传递数据吗?由于某种原因,我只在我的其他视图中工作的 url 中完成了它
    • @osiris355 我编辑了我的评论。 POST 请求的工作方式与 GET 不同,因为您在浏览器发送到服务器的 HTTP 标头之后直接发送数据。更多信息在这里:stackoverflow.com/a/5876931/1165441
    • 控制器中仍然为空 $(function() { $("#btnLogin").click(login); }); function login() { var name = $('#txtUsername').val(); var pass = $('#txtPassword').val(); $.post(@Url.Action("Login", "User"), { name: name, pass: pass }, loginSuccess, "application/json"); } 函数 loginSuccess() { };
    【解决方案6】:

    您可以将其发布为 ::

        $.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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多