在mvc中的表单发布时,客户端数据如何反序列化为模型类

时间:2014-08-12 07:12:19

标签: asp.net-mvc

假设我的模型类看起来像

public class Person
    {
        [Required]
        [MaxLength(50,ErrorMessage="Full name should be within 50 character")]
        public string full_name { get; set; }

        [Range(18,80)]
        [Required(ErrorMessage="Please provide age")]
        public Int32 Age { get; set; }
    }

我有基于此模型类的表单

@{Html.BeginForm("PostData", "Customodelbinder");
                <table>
                    <tr>
                        <td>First Name : </td>
                        <td>@Html.TextBox("first_name")</td>
                    </tr>
                    <tr>
                        <td>Middle Name : </td>
                        <td>@Html.TextBox("middle_name")</td>
                    </tr>
                    <tr>
                        <td>Surname :</td>
                        <td> @Html.TextBox("last_name")</td>
                    </tr>
                    <tr>
                        <td>Age:</td>
                        <td> @Html.TextBox("age") </td>
                    </tr>
                    <tr>
                        <td></td>
                        <td>
                            <input type="submit" name="Save" value="Save" />
                        </td>
                    </tr>
                </table>
            }

现在我想知道何时提交表单,然后将调用PostData以及数据将如何从客户端自动发布到Person模型类

public void PostData(Person person)
{

}

我搜索谷歌,发现我们需要使用 ModelBinder 是真的吗?什么时候应该使用 ModelBinder

http://www.codeproject.com/Tips/806415/Model-Binding-using-IModelBinder-and-DefaultModelB

不使用 ModelBinder 我们不能将客户端数据发布到操作方法,其中action方法将具有person参数,并且自动客户端人员数据将de-serialize发送给person class? ?

请帮助我如何使用&amp;没有带有一些示例代码的模型绑定感谢

1 个答案:

答案 0 :(得分:0)

  

我搜索谷歌,发现我们需要使用ModelBinder是真的吗?

部分地,DefaultModelBinder在大多数情况下都能很好地工作,其中涉及原始甚至复杂类型。因此,在大多数情况下,您不需要考虑编写ModelBinder。我有6-8个控制器和150+动作,不需要写一个活页夹。

when one should use ModelBinder ?

DefaultModelBinder无法将您的请求数据绑定到模型中时。例如您正在从具有典型格式,安全密钥,数据等的设备收到请求。DefaultModelBinder适用于最佳案例匹配,即它会查看您请求参数并尝试在模型中查找确切名称,如果匹配找到了,它会复制模型中的值。

without using ModelBinder can't we post client side data to action method where action method will have person argument and automatically client side person data will be de-serialize to person class ??

当然可以,我们都这样做。使用AJAX post方法。将模型数据传递到ajax请求中的data属性。如果正确命名js模型,数据将完美地绑定到控制器操作参数。 e.g。

var searchResultModel = { searchId: searchId, isSearchEdited: true };

    // Get the result view
    $.ajax({
    url: '@Url.Action("SearchResult", "Search")',
    contentType: 'application/json; charset=utf-8',
    type: 'POST',
    dataType: 'html',
    data: JSON.stringify(searchResultModel)
    })
    .success(function (searchResult) {
        $('#contentLoader').html(searchResult);
    });