1

我的搜索未能找到我认为是一个很好的旅行主题。我在底部列出的选项反映了我发现的一些东西。

我需要从服务器端将视图呈现为 ViewModel 或通过 JSON 对象。JSON 对象将来自服务器。

在客户端,我使用 ajax,有时我会根据页面上的其他 id/属性来确定插入,以确定我是追加/前置/替换还是忽略放置到目标元素。

对于 ViewModel 或 JSON 对象,我必须使用哪些选项?

我曾考虑在编译时渲染视图的 File.Js 版本。将其作为资源包含在页面上并在var ViewHtmlTemplate = "<div>@Model.Message</div>. 在将所有格式化/if 语句逻辑移动到也将被 JSON 序列化的视图模型时,我必须非常自律。

或者,视图有一个脚本标签来将序列化的 ViewModel 绑定到一个 js var,然后在准备好的文档上运行一个函数。

第三个选项不是返回 JSON 对象,而是返回服务器端已经 html 渲染的视图数组。

4

2 回答 2

1

我所做的是在我的视图模型内部,我将有一个字段,它是一个字符串,它是一个序列化的 json 结构。

public class SomeVM
{
 /* other properties */
 public string jsonString { get; set; }
}

在控制器中,我会将一些数据序列化到 jsonString 中。然后在视图中,我将字符串分配给一个变量

@model SomeVM
<script>
 var jsonVM = @( Html.Raw(Model.jsonString) );
</script>
于 2013-04-08T23:41:31.220 回答
0

我正在使用在 json 对象中返回 Html 的解决方案。如果这样做有任何问题,请告诉我。这是我的做法。

用于渲染部分视图的控制器扩展(包含但未在此解决方案中使用的是 RenderViewToString)。这可以在不同的答案中以各种形式找到,这些答案似乎与我不认为的我的定制版本不匹配。

namespace System.Web.Mvc
{
    using System.IO;

    public static class MvcControllerExtension
    {
        public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null)
        {
            if (string.IsNullOrEmpty(viewName))
            {
                viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
            }

            controller.ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return sw.GetStringBuilder().ToString();
            }
        }

        public static string RenderViewToString(this Controller controller, string viewName = null, object model = null, string masterName = null)
        {
            if (string.IsNullOrEmpty(viewName))
            {
                viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
            }

            controller.ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, masterName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return sw.GetStringBuilder().ToString();
            }
        }
    }
}

在返回 JsonResult 的控制器动作中

public JsonResult _DisplayByFoo(int catId)
{
    var myRealModel = new MyRealModel(catId);
    // .... omitted the construction of MyRealModel
    var jsonModel = new JsonModel(myRealModel);
    jsonModel.Html = this.RenderPartialViewToString("_Display", myRealModel);
    return Json(jsonModel);
}

我还在 json 对象上包含其他属性,这些属性可以帮助我确定我的插入模式。

在 Js 中;在我的 AjaxCall 到 Json 操作之后。运行 OnSuccess 方法,除其他逻辑外,该方法执行以下操作。

$("#" + targetId).append(MyJson.Html);
于 2013-04-09T00:59:41.187 回答