我正在进行AJAX调用(使用jQuery)来检索PartialView.与HTML一起,我想发送一个View正在显示的对象的JSON表示.我一直在使用的糟糕方式是将属性作为隐藏输入嵌入到HTML中,这很快变得难以处理并且紧密地耦合太多东西.
我可以在< script>中发送JavaScript.在HTML之后标记,但我真的很肛门将这些东西分开.这看起来像这样:
<%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewUserControl<Person>" %>
<div class="person">
First Name: <%= Html.TextBox("FirstName", Model.FirstName) %>
Last Name: <%= Html.TextBox("LastName", Model.LastName) %>
</div>
<script type="text/javascript">
// JsonSerialized object goes here
</script>
我考虑的另一个选项是对返回JsonResult的动作进行第二次AJAX调用,但这也感觉设计不好.
解决方法:
我想我发现了一个非常好的方法,只需将JSON包装在HtmlHelper扩展中.这是班级:
using System.Web.Script.Serialization;
public static class JsonExtensions {
public static string Json(this HtmlHelper html, string variableName) {
return Json(html, variableName, html.ViewData.Model);
}
public static string Json(this HtmlHelper html, string variableName, object model) {
TagBuilder tag = new TagBuilder("script");
tag.Attributes.Add("type", "text/javascript");
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
tag.InnerHtml = "var " + variableName + " = " + jsonSerializer.Serialize(model) + ";";
return tag.ToString();
}
}
你通过以下方式调用它:
<%= Html.Json("foo") %>
<%= Html.Json("bar", Model.something) %>
我能想到的一个问题是它不是一个完全完美的分离;你仍然在技术上将JavaScript放在HTML中.但是,它不会对服务器进行额外调用,并且IDE中的标记仍然非常干净.