1

私の検索では、よく旅行されるテーマだと思っていたものを見つけることができませんでした. 下部に概説されているオプションは、私が見つけたいくつかのことを反映しています。

サーバー側から ViewModel として、または JSON オブジェクトを介してビューをレンダリングする必要があります。JSON オブジェクトはサーバーから取得されます。

クライアント側では ajax を使用し、ページの他の ID/属性に基づいて、ターゲット要素に追加/前置/置換するか無視して配置するかを決定することがあります。

ViewModels または JSON オブジェクトに同じビューを使用するには、どのようなオプションが必要ですか?

コンパイル時に、ビューの File.Js バージョンをレンダリングすることを検討しました。それをリソースとしてページに含め、 で置換を実行しますvar ViewHtmlTemplate = "<div>@Model.Message</div>。すべての書式設定/if ステートメント ロジックを、JSON シリアル化されたビューモデルに移動する際には、非常に厳格にする必要があります。

または、ビューに、シリアル化された ViewModel を js var にバインドし、ドキュメントの準備ができたときに関数を実行するスクリプト タグがあること。

3 番目のオプションは、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で; Jsonアクションへの私のAjaxCallの後。OnSuccess メソッドを実行します。このメソッドは、他のロジックとは別に、次のことを行います。

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