如何在MVC4中将字符串化的Json从视图发送到控制器

时间:2014-11-27 08:49:29

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

我想在按钮点击时发送一个字符串化的Json对象。我正在尝试如下...按下按钮我可以调用所需的Action方法,但是它正在传递null参数 ..

MemberLogin.cshtml

<input type="button" value="» Continue" id="btnLogin" onclick="PostData();">

<script type="text/javascript">
    function PostData() {
        var ObjLogInDto = new Object();
        ObjLogInDto.UserName = $("#txtUserName").val();
        ObjLogInDto.Password = $("#txtMemberPassword").val();
        ObjLogInDto.CaptchaText = $("#txtCaptcha").val();
        var StringifiedData = JSON.stringify(ObjLogInDto);
        $.ajax({
            url: '@Url.Content("~/Member/MemberLogin/MemberLogin")',
            async: false,
            type: "POST",
            data: StringifiedData,
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            error: function (jqXHR, textStatus, errorThrown) {
                alert("ERROR:" + jqXHR + "-" + textStatus + "-" + errorThrown);
            },
            success: function (data, textStatus, jqXHR) {
                alert("SUCCESS:" + data.Message);
            }
        });
    }
</script>

行动方法

[HttpPost]
    public ActionResult MemberLogin(string JsonStr)
    {
        var ObjMemberLoginDto =
            new JavaScriptSerializer().Deserialize<MemberLoginDto>(JsonStr);
    }

我为此JsonStr获取null。 注意:我已经包含了Json2.js。 ajax调用中的StringifiedData包含字符串化数据。如 {"UserName":"TEST13361","Password":"testpswd","CaptchaText":"gz8h4"}

3 个答案:

答案 0 :(得分:1)

改变这个:

data: StringifiedData,

到此:

data: {JsonStr: StringifiedData},

您需要传递一个包含JsonStr作为键名称且StringifiedData作为值的对象,因为在后端代码中期望请求中的参数名为JsonStr,但它不可用那就是null

答案 1 :(得分:1)

$ .ajax(...)配置中的

'contentType'属性存在问题。 删除contentType,以便将其设置为默认值或设置正确的内容类型。 您可以在内容类型here

上找到更多信息

同样如@Jai建议的那样,你需要将ajax(...)设置中的“data”包装成一个键值对,其键值与action方法的参数名称相同,用于正确的模态绑定。 / p>

答案 2 :(得分:1)

MVC控制器发送的内容并不清楚。您可以使用两种方式:

将命名参数发送到控制器

喜欢这个 js

$.ajax({
   url: '@Url.Content("~/Member/MemberLogin/MemberLogin")',
   type: "POST",
   data: { UserName : $("#txtUserName").val(), /*And more*/},
   //something else
});

然后在 controller

[HttpPost]
public ActionResult MemberLogin(string UserName, string Password, string CaptchaText) {
    //Operations here
}

将定义的对象发送到控制器

模型

public class Test
{
   public string UserName;
   public string Password;
   public string CaptchaText;
}

控制器

[HttpPost]
public ActionResult MemberLogin(Test test) {
    //Operations here based on test
}

最后在 js

var _data = {
    UserName: $("#txtUserName").val(),
    Password: $("#txtMemberPassword").val(),
    CaptchaText: $("#txtCaptcha").val()
};

$.ajax({
    url: '@Url.Content("~/Member/MemberLogin/MemberLogin")',
    type: "POST",
    dataType: "json",
    data: _data,
    //something else
});

如果您坚持使用字符串化的json ,请查看如何在mvc4中将Json字符串发送到控制器并反序列化json enter link description here