如何正确使用Html.Raw(Json.Encode(Model))?

时间:2015-02-24 16:33:01

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

我正在尝试使用以下代码对MVC模型进行编码,但警报消息为我提供了一个空值。我不确定它为什么给我一个空值,因为这是一个创建表单。我正在尝试从此创建一个模型,我的HTML代码具有以下外观:

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Customer</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" id="submit" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    <script type="text/javascript">
        $(document).ready(function () {
            $('#submit').click(function () {
                var JsonModel = '@Html.Raw(Json.Encode(@Model))';

                alert(JsonModel); // json as string

                var model = JSON.parse(JsonModel); // will give json
                alert(model);

                $.ajax({
                    type: "POST",
                    url: "../Home/Index",
                    data: {"cus" :  model},
                    success: function(data){
                        alert("done");
                    },
                    error:function(){
                        alert("Error!!!!");
                    }
                });
            });
        });
    </script>
} 

3 个答案:

答案 0 :(得分:6)

它返回null,因为 为null。在页面呈现时(以及您对Json.Encode(Model)的调用运行),用户最终将在表单中输入的数据不可用。像JavaScript一样运行客户端,而所有Razor的东西在发送到客户端之前运行服务器端。如果你想从表单中获取用户输入的数据以便在你的AJAX调用中使用,那么你需要像@Sippy一样建议并通过JavaScript检索它:

$('form').serializeObject();

此外,如果您确实需要在渲染时对模型进行实际编码(可能与Knockout一样使用),则无需将其设置为字符串然后解析字符串。只需将其设置为常规JavaScript对象即可。无论如何,这都是JSON:

var model = @Html.Raw(Json.Encode(Model));

答案 1 :(得分:0)

我的回答here显示(在JQuery部分中)如何完全使用Json.Encode

它背后的基本思想是,通过使用jQuery函数,您可以构建一个JSON对象,MVC将能够以任何形式解析为数据模型。

功能如下:

$.fn.serializeObject = function () {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function () {
        if (o[this.name]) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

在您的情况下,您的AJAX将成为

 $.ajax({
     type: "POST",
     url: "../Home/Index",
     data: { cus : JSON.stringify($('form').serializeObject()) },
     success: function(data){
         alert("done");
     },
     error:function(){
         alert("Error!!!!");
     }
 });

如果您在$('form')工作时遇到问题,可能是因为您在同一页面上有多个表单,请使用类或ID来唯一标识您的表单。

答案 2 :(得分:0)

此示例编码模型(即List<My>)并将其作为名为model的Json对象发布到操作。

var jsonModel = '@Html.Raw(Json.Encode(Model))';
    var id = rowid;
    $.ajax({
        url: 'DeleteRows',
        contentType: 'application/json; charset=utf-8',
        type: 'POST',
        dataType: 'html',
        data: '{ "model": { "rows":' + jsonModel + '}}'
    })
    .success(function (result) { $("#grdRows").empty(); $("#grdRows").html(result); })
    .error(function (xhr, ajaxOptions, thrownError) { alert(xhr.status + ' - ' + ajaxOptions + ' - ' + thrownError); alert(xhr.responseText); });