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

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

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

Customer


@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
}
@Html.ActionLink("Back to List", "Index")
@section Scripts { $(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!!!!"); } }); }); }); }

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

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

function如下:

 $.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来唯一标识您的表单。

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

 $('form').serializeObject(); 

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

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

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

 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); });