【问题标题】:Jquery post to mvc 4 controller not passing dataJquery发布到mvc 4控制器不传递数据
【发布时间】:2013-09-15 17:02:13
【问题描述】:

我正在尝试将数据从 JQuery 传递到 MVC 4 控制器。控制器被调用,但没有数据传递。过去我总是只使用表单序列化,但在这里不合适。

我的控制器:

[HttpPost]
public ActionResult Write(VideoSessionEnvelope envelope)
{
    if (ModelState.IsValid)
    {
        envelope = Log.Write(envelope);
    }
    var result = Json(envelope);
    return result;
}

我们使用信封类作为所有视图模型的容器

public class VideoSessionEnvelope : BaseEnvelope
{
    public VideoSessionEnvelope()
    {
        SessionStart = new VideoSessionStartViewModel();
    }
    public Guid? LogEntryID { get; set; }
    public VideoSessionStartViewModel SessionStart { get; set; }
    }
}

视图模型

public class VideoSessionStartViewModel: IViewModel
{
    public string SessionId { get; set; }
    public int UserId { get; set; }
    public string Message { get; set; }
}

最后是javascript

var Logging = Logging || {};
Logging.VideoSession = function () {
    var Start = function (sessionId, userId, message) {
    var envelope = {
            SessionStart: {
                "SessionId": sessionId,
                "UserId": userId,
                "Message": message
            }
        }
        var data = JSON.stringify(envelope);
        $.ajax({
            type: "POST",
            url: "/Logging/Write",
            data: data,
            datatype: "application/json",
            success: function (result) {
                return result;
            },
            error: function (request, status, error) {
                return error;
            }
        });
    };

    return {
        Start: Start
    };
}();

根据 Firebug,数据传递为

JSON
SessionStart  Object { SessionId="sessionIdVal", UserId=123, Message="messageValue"}
Message      "messageValue"
SessionId    "sessionIdVal"
UserId       123

控制器被调用,但视图模型中的属性始终为空。我在主题上尝试了几种变体,似乎没有任何效果。

【问题讨论】:

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


    【解决方案1】:

    尝试将您的数据包装在名称为信封的文字中,以便模型绑定器将其拾取:

    data: { envelope: data },
    

    更新

    删除对JSON.stringify()的调用,序列化对象字面量不是严格必要的。

    【讨论】:

    • 这是我尝试过的选项之一,还有 var envelope = { envelope: { SessionStart: { ...
    • @AllenJergensen 如何删除JSON.stringify() 调用并按原样传递数据。我觉得没必要序列化。
    • 感谢 asymptoticFault - 问题是字符串化(稍作调整)... var envelope = { 'SessionStart.SessionId': sessionId, 'SessionStart.UserId': userId, 'SessionStart.Message' : message } $.ajax({ type: "POST", url: '/Logging/Write', data: 信封, ...
    • @AllenJergensen 啊,太好了。我认为像您最初那样嵌套对象会很好,但我可以看到像这样明确命名它们会有所帮助。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多