【问题标题】:JSON post data to mvc controllerJSON 将数据发布到 mvc 控制器
【发布时间】:2013-09-11 18:57:04
【问题描述】:

我有一个包含 Person 和 Address 的实体类。

public class Person
{
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public List<Address> Addresses { get; set; }
}

public class Address
{
   public string ZipCode { get; set; }
   public string City { get; set; }
   public string State { get; set; }
   public string Country { get; set; }
}

在我看来,我显示了一些复选框。

@model DataContext.Models.Persons

@{
    ViewBag.Title = "Person list";
}

@using (Html.BeginForm("Update", "Test", FormMethod.Post))
{

    <div id="personContainer">
        @foreach(var t in Model.Person)
        {
            <input type="checkbox" value="@t.ID" name="@t.FirstName ">@t.FirstName <br />
        }
    </div>
    <p>
        <input type="submit" id="save">
    </p> 
}

我的控制器如下所示:

[HttpPost]
public JsonResult Update(Person p)
{

   return Json( new { redirectTo = Url.Action("Index") });
}

我要发布的数据必须是强类型的。 如何使用 JSON 将数据(在本例中为所有复选框)回发到“更新”控制器?

【问题讨论】:

  • 有没有人可以帮我解决这个问题?

标签: c# asp.net-mvc json postback


【解决方案1】:

您需要为视图模型的每个属性提供输入。

每个输入上的 name 属性需要与 MVC 识别它的属性名称相同。

例如:

@model Person

@using (Html.BeginForm("Update", "Test", FormMethod.Post))
{
    @Html.HiddenFor(model => model.ID)

    <input type="checkbox" value="@model.FirstName" name="FirstName ">@model.FirstName <br />
    <input type="checkbox" value="@model.LastName" name="LastName ">@model.LastName <br />
    @Html.EditorFor(model => model.Addresses)

    <input type="submit" id="save">
}

对于地址,创建一个编辑器模板,剃须刀引擎会意识到该属性是一个可枚举的。

它会将可枚举的数字添加到名称属性中,如下所示:

<input id="addresses_0__city" type="text" value="City" name="addresses[0].city">

请注意,名称具有数组样式。

  • 要创建编辑器模板,请在您的“共享”视图文件夹(或相关视图文件夹)中创建一个名为“EditorTemplates”的文件夹。
  • 创建一个名为Address(与类型相同)的局部视图。
  • 为每个地址添加您想要查看的 HTML:

    @model Address
    
    @Html.CheckBox("ZipCode", false, new { value = Model.ZipCode}) @Model.ZipCode
    <br />
    @Html.CheckBox("City", false, new { value = Model.City}) @Model.City
    <br />
    @Html.CheckBox("State", false, new { value = Model.State}) @Model.State
    <br />
    @Html.CheckBox("Country", false, new { value = Model.Country}) @Model.Country
    <br />
    

这会起作用,但它不会将表单发布为 JSON。如果您需要专门发布为 JSON,您可以在 AJAX POST 上将表单数据转换为 JSON:

$.ajax("/Test/Update",
{
    type: "post",

    data: JSON.stringify($('form').serializeObject()), // converting to JSON
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (data) {}      
    error: function () {}
});

对于 JSON.stringify,首先使用以下方法将表单放入对象形式:

$.fn.serializeObject = function () {
    var obj = {};
    var arr = this.serializeArray();

    $.each(arr, function () {
        var splt = this.name.split(".", 2);
        if (splt.length === 2) {
            if (obj[splt[0]] === undefined) {
                obj[splt[0]] = {};
            }
            obj[splt[0]][splt[1]] = this.value || '';
        }
        else if (obj[this.name] !== undefined) {
            if (!obj[this.name].push) {
                obj[this.name] = [obj[this.name]];
            }
            obj[this.name].push(this.value || '');
        }
        else {
            obj[this.name] = this.value || '';
        }
    });
    return obj;
};

【讨论】:

    【解决方案2】:

    设置一个jquery方法在表单提交上运行,将序列化的表单发送到Begin Form中的控制器

    $('formSelector').submit(function () {
        if ($(this).valid()) {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    if (result.Success == true) {
    
                    }
                    else {
                        $('#Error').html(result.Html);
                    }
                }
            });
        }
        return false;
    });
    

    【讨论】:

    • 什么是formSelector?我尝试了您的代码,但是当它进入控制器时,数据在发布时为空。我错过了什么吗?
    • @Yustme 这将是您表单的路径,因此如果您的表单的 ID 为“person”,您将拥有 $('#person').submit。如果这是页面上唯一的表单,您可以使用 $('form').submit 选择提交按钮。我假设你知道 jQuery 语法。?
    • 没有深入的知识,只是一些基础知识。但是如何提交所有带有 id 的复选框以供以后参考?
    猜你喜欢
    • 2018-12-01
    • 2012-11-26
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2012-10-03
    • 2015-08-02
    相关资源
    最近更新 更多