在我的控制器中,我将对象列表发送到视图(index.cshtml
)
return View(AdsPrevModel);
在index.cshtml
:
<div id ="ele">
<ul>
<li> name1<input id="a1" type="checkbox"/></li>
</ul>
</div>
当用户点击复选框时,我使用jquery来知道用户是否选中了该框:
我的javascript文件:
$('#ele :checkbox').click(function () {
if ($(this).is(':checked')) {
alert($(this).attr('id'));
} else {
alert('unchecked');
}
});
如何将我的AdsPrevModel放入我的js文件?
我知道我可以这样做:
在我的HTML中,添加:
<input type="hidden" id="AdsPrevModel" value="@Model.AdsPrevModel" />
并在js:
var adsPrevModel = JSON.parse(document.getElementById('AdsPrevModel').value);
我的html中是否有其他选项没有添加隐藏输入?
可能类似js文件中的以下内容:
var adsPrevModel = JSON.parse(Model.AdsPrevModel));
答案 0 :(得分:2)
最佳做法是
对该控制器执行ajax调用,该控制器应返回json结果
return JSON( model ) ;
答案 1 :(得分:1)
在您共享的代码中,没有任何内容向客户端发布模型,因此目前没有直接的方法可以让JavaScript代码访问它。
由于您将视图绑定到模型,因此视图可以以各种方式包含它。它可以是模型成员的一系列隐藏字段(不是整个模型,除非它可以完整地表示为字符串)。像这样:
@Html.HiddenFor(x => x.SomeField)
@Html.HiddenFor(x => x.AnotherField)
这将为模型上的两个字段创建两个隐藏的input
。根据模型的复杂程度,这可能会很麻烦。
您也可以以类似的方式直接将模型发布到JavaScript代码:
var someField = @Model.SomeField;
var anotherField = @Model.AnotherField;
同样,如果模型很复杂,这很快就会变得很麻烦。即使您尝试从中构建实际的JavaScript对象:
var theModel = {
someField : @Model.SomeField,
anotherField : @Model.AnotherField
};
(另请注意,当你混淆razor语法和这样的JavaScript时,我看到Visual Studio变得非常困惑。在2012年不再那么多,但在2010年有很多。)
您可以使用the JavaScriptSerializer
之类的内容在模型上为其自身的序列化版本添加属性。我以前从未这样做过,但它应该有效。在模型上有这样的东西:
public string SerializedCopy
{
get
{
return new JavaScriptSerializer().Serialize(this);
}
}
虽然可能需要一些调整才能让它发挥作用。
最后,一个特别干净的选项只需要向服务器发出另一个请求就是让另一个操作只返回该模型的JSON版本。像这样:
public ActionResult SomeActionName()
{
// get the model somehow, then...
return Json(AdsPrevModel);
}
然后,您的JavaScript代码只需要调用此操作来获取代表整个模型的JSON对象:
var theModel = {};
$.get('@Url.Action("SomeActionName", "SomeController")', function (data) {
// maybe do some error checking here?
theModel = data;
});
然后,如果您的实际视图实际上不是绑定任何模型,那么返回该视图的操作不需要获取模型并将其提供给视图。 JavaScript代码将通过调用此其他操作来获取模型,该操作返回JSON数据而不是视图。