如何正确使用Html.Raw(Json.Encode(Model))?
How to use Html.Raw(Json.Encode(Model)) properly?
我正在尝试使用以下代码对我的 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>
}
我的回答 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 来唯一标识您的表单。
它返回空值,因为它是空值。用户最终输入表单的数据在页面呈现时不可用(以及您对 Json.Encode(Model)
运行s 的调用)。诸如 JavaScript 运行 客户端 之类的东西,而所有 Razor 东西 运行s 服务器端 在它被发送到客户端之前。如果您想从表单中获取用户输入的数据以用于 AJAX 调用,那么您需要按照@Sippy 的建议进行操作并通过 JavaScript:
检索它
$('form').serializeObject();
此外,如果您确实需要在渲染时对模型进行实际编码(可能与 Knockout 之类的东西一起使用),则无需将其设置为字符串然后解析该字符串。只需将其设置为常规 JavaScript 对象即可。 JSON 就这些了:
var model = @Html.Raw(Json.Encode(Model));
此示例对一个模型(即 List<My>
)进行编码,并将其 POST 作为一个名为模型的 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); });
对于那些想要将模型传递给操作方法 (HttpGet) 的人
与 Url.Action 助手
@model AddViewModel
<script type="text/javascript">
$(document).ready(function () {
openDoc();
});
function openDoc() {
var model = '@Html.Raw(Json.Serialize(Model))';
var obj = JSON.parse(model);
var params = $.param(obj);
var url = '@Url.Action("GetPdf", "Declaration")?' + params;
window.open(url);
}
</script>
我正在尝试使用以下代码对我的 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>
}
我的回答 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 来唯一标识您的表单。
它返回空值,因为它是空值。用户最终输入表单的数据在页面呈现时不可用(以及您对 Json.Encode(Model)
运行s 的调用)。诸如 JavaScript 运行 客户端 之类的东西,而所有 Razor 东西 运行s 服务器端 在它被发送到客户端之前。如果您想从表单中获取用户输入的数据以用于 AJAX 调用,那么您需要按照@Sippy 的建议进行操作并通过 JavaScript:
$('form').serializeObject();
此外,如果您确实需要在渲染时对模型进行实际编码(可能与 Knockout 之类的东西一起使用),则无需将其设置为字符串然后解析该字符串。只需将其设置为常规 JavaScript 对象即可。 JSON 就这些了:
var model = @Html.Raw(Json.Encode(Model));
此示例对一个模型(即 List<My>
)进行编码,并将其 POST 作为一个名为模型的 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); });
对于那些想要将模型传递给操作方法 (HttpGet) 的人 与 Url.Action 助手
@model AddViewModel
<script type="text/javascript">
$(document).ready(function () {
openDoc();
});
function openDoc() {
var model = '@Html.Raw(Json.Serialize(Model))';
var obj = JSON.parse(model);
var params = $.param(obj);
var url = '@Url.Action("GetPdf", "Declaration")?' + params;
window.open(url);
}
</script>