返回包含HTML和JavaScript的PartialView

返回包含HTML和JavaScript的PartialView,javascript,asp.net-mvc,ajax,Javascript,Asp.net Mvc,Ajax,我正在进行一个AJAX调用(使用jQuery)来检索PartialView。与HTML一起,我想发回视图显示的对象的JSON表示。我一直使用的糟糕方法是在HTML中嵌入属性作为隐藏输入,这很快就会变得非常笨拙,并且紧密地耦合了太多的内容 我可以在HTML之后用标记发送JavaScript,但我真的不想把这些东西分开。看起来是这样的: <%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewU

我正在进行一个AJAX调用(使用jQuery)来检索
PartialView
。与HTML一起,我想发回视图显示的对象的JSON表示。我一直使用的糟糕方法是在HTML中嵌入属性作为隐藏输入,这很快就会变得非常笨拙,并且紧密地耦合了太多的内容

我可以在HTML之后用
标记发送JavaScript,但我真的不想把这些东西分开。看起来是这样的:

<%@ 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>
{
    Html: "<div class=\"person\"> etc...",
    Json: { // your object here
          }
}

名字:
姓氏:
//JsonSerialized对象位于此处

我考虑过的另一个选项是对返回
JsonResult
的操作进行第二次AJAX调用,但这也感觉像是糟糕的设计。

可能不是最优雅的答案,但只是想把它抛到一边:

您可以从action方法返回纯json

看起来像这样的东西:

<%@ 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>
{
    Html: "<div class=\"person\"> etc...",
    Json: { // your object here
          }
}

与Andrew的解决方案相同,但可能更像MVC

创建从ViewPage继承的新类。重写其呈现方法以呈现页面本身,然后将其填充到输出中。因此,所有的黑客行为都发生在渲染方法中,应该发生在渲染方法中

现在,创建的每个视图都将更改线:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<MyModel>" %>



我没有亲自检查,但我想应该能用。如果您愿意,我可以尝试构建它。

我想我找到了一个很好的方法,只需将
JSON
封装在
HtmlHelper
扩展中。下面是课程:

public static string RenderPartialToString(string controlName, object viewData, object model, System.Web.Routing.RequestContext viewContext)
            {

                ViewDataDictionary vd = new ViewDataDictionary(viewData);
                ViewPage vp = new ViewPage { ViewData = vd };

                vp.ViewData = vd;
                vp.ViewData.Model = model;
                vp.ViewContext = new ViewContext();
                vp.Url = new UrlHelper(viewContext);

                Control control = vp.LoadControl(controlName);

                vp.Controls.Add(control);

                StringBuilder sb = new StringBuilder();

                using (StringWriter sw = new StringWriter(sb))
                {

                    using (HtmlTextWriter tw = new HtmlTextWriter(sw))
                    {

                        vp.RenderControl(tw);

                    }

                }

                return sb.ToString();

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


我能想到的一个问题是,这不是一个完全完美的分离;从技术上讲,您仍然在HTML中添加JavaScript。但是,它不需要额外调用服务器,IDE中的标记仍然非常干净。

很有趣。我会看一看,但我不知道这是否“感觉”正确,就像短路MVC框架一样。我可能只是太挑剔了:)。我知道,闻起来有点黑,不是吗?你为什么不也在json中返回你的个人数据,并用javascript构建html呢?视图中有一些东西更容易用MVC模板实现。同意!我也有同样的问题,通过jQuery构建HTML将是一件棘手的事情。你最后做了什么?我现在也有同样的问题。@swilliams,你能发布检索部分视图的jQuery代码吗。我很想看看是怎么做的。Thanks@Picflight-与普通视图和$.post()或$.ajax()函数相同。诀窍是在动作中返回PartialView。从jQuery(一种HTML响应)的角度来看也是如此。下面是我的“真正”解决方案。