0

Razor View がレンダリングする html の文字列を返すようにして、コントローラーがビューだけでなくビューからレンダリングされた html 文字列を返すようにしたいと思います。ASP.NET MVC には、これを行うためのネイティブ メソッドはありません。これに対する回避策はありますか?

実例として:

 public ActionResult Index()
        {
            return View().ToString; //View has no ToString() method but this is what I am trying to do
        }
4

1 に答える 1

3

Html.Partialビューのを返すために使用できMvcHtmlStringます。

Partialメソッドはで 見つけることができますSystem.Web.Mvc.Html.PartialExtensions

この方法の詳細については、http://msdn.microsoft.com/en-us/library/ee402898.aspxを参照してください。

私は個人的にこれをRenderPartials(複数)拡張メソッドに使用しています。

   public static void RenderPartials<T>(this HtmlHelper helper, 
            string partialViewName, IEnumerable<T> models, string htmlFormat)
        {
            if (models == null)
                return;

            foreach (var view in models.Select(model => 
                  helper.Partial(partialViewName,model, helper.ViewData)))
            {
                helper.ViewContext.HttpContext.Response
                  .Output.Write(htmlFormat, view);
            }
        }

アップデート

コントローラー内の文字列にビューをレンダリングするには、次のようなことを行うことができます(少しハックのように見えますが)。

var htmlHelper = new HtmlHelper(new ViewContext(), new ViewPage());
var viewString = htmlHelper.Partial("PartialViewName");

ちょっとしたハックだと言う理由は、HtmlHelperがコントローラーやモデルではなく、ビューで使用されるように設計されているためです。そうは言っても、それが機能し、解析されたビューを文字列化する代替手段がない場合は、それが役立つ可能性があります。

あなたの質問の修正を考えると、あなたはこのようなものを探しているでしょう:

public string Index()
{
    var htmlHelper = new HtmlHelper(new ViewContext(), new ViewPage());
    return htmlHelper.Partial("PartialViewName");
}

上記のコードでhtmlHelperが正しく作成されない場合は、代わりに次のように作成できます。

TextWriter writer = new StringWriter();
var htmlHelper = new HtmlHelper(new ViewContext(ControllerContext, 
                new RazorView(ControllerContext, "","",true,null), 
                new ViewDataDictionary(), 
                new TempDataDictionary(), writer), new ViewPage());
于 2012-04-12T10:23:32.087 に答える