将复杂的词典发布到Controller

时间:2016-07-08 11:58:57

标签: javascript c# jquery asp.net-mvc nancy

我正在尝试将以下类型发布到我的控制器。

模型

public class EmailNotificationSettings
{
    public string EmailHost { get; set; }
    public string EmailPassword { get; set; }
    public int EmailPort { get; set; }
    public string EmailSender { get; set; }
    public string EmailUsername { get; set; }
    public bool Enabled { get; set; }
    public bool EnableUserEmailNotifications { get; set; }
    public string RecipientEmail { get; set; }
    public Dictionary<NotificationType, NotificationMessageContent> Message { get; set; }
}

NotificationType

public enum NotificationType
{
    NewRequest,
    Issue,
    RequestAvailable,
    RequestApproved,
    AdminNote,
    Test,
}

NotificationMessageContent

public class NotificationMessageContent
{
    public string Subject { get; set; }
    public string Body { get; set; }
}

现在除了Message之外,所有属性都是我的表单的一部分。 以下是我计划填充Message

的方法

查看

<label for="newRequestSubject" class="control-label">New Request Subject</label>
<div>
    <input type="text" class="form-control form-control-custom " id="newRequestSubject" name="newRequestSubject" value="@Model.Message.FirstOrDefault(x => x.Key == NotificationType.NewRequest).Value.Subject">
</div>

<label for="newRequestBody" class="control-label">New Request Body</label>
<div>
    <input type="text" class="form-control form-control-custom " id="newRequestBody" name="newRequestBody" value="@Model.Message.FirstOrDefault(x => x.Key == NotificationType.NewRequest).Value.Body">
</div>

要发布的Javascript

 $('#save').click(function (e) {
        e.preventDefault();

        var newRequestObj = {
            "Subject": $('#newRequestSubject').val(),
            "Body": $('#newRequestBody').val()
        };
        var message = { 'NewRequest': JSON.stringify(newRequestObj) };

        var $form = $("#mainForm");
        var data = $form.serialize();

        data = data + "&" +JSON.stringify(message);

        $.ajax({
            type: $form.prop("method"),
            data: data,
            url: $form.prop("action"),
            dataType: "json",
            success: function (response) {
               // Do something
            }
        });
    });

现在这显然是错误的方法,因为我的Message属性没有被填充。

知道如何向控制器发送POST并更新我的模型吗?

控制器,如果你想看(使用NancyFX)

private Response SaveEmailNotifications()
{
    var settings = this.Bind<EmailNotificationSettings>();
    // settings.Message doesn't contain the new values
}

1 个答案:

答案 0 :(得分:0)

我想不出一种方法可以使它与纯HTML一起使用。问题是你需要提交一个名为“Message”的控件,其中包含数据,然后MVC映射引擎会将该控件映射到模型的“Message”属性。

我能想到的最好的方法是使用一个JavaScript函数(绑定到表单的onsubmit事件),它将信息收集为一个对象数组并将其分配给一个名为“Message”的变量然后将其与其余表单数据序列化并提交表单。