1

MVC アプリケーションは初めてで、かみそりビューを文字列にレンダリングしようとしています。私が持っているコードは、独自のコントローラー内から呼び出されたときにうまく機能しますが、別のコントローラーからコントローラーを呼び出そうとすると、ControllerContext を送信しているにもかかわらず、Controller コンテキストが null になります。私はコンテキストをどこかで失っていると確信しています。

ここにいくつかのコードがあります。

ここでコントローラーを呼び出します。

var emailController = new EmailController();
emailController.ControllerContext = this.ControllerContext;
emailController.SendMail(entry.email, entry.first, entry.word);

ここで、html の文字列を返すメソッドを呼び出します。"Template" はビュー (Template.cshtml) で、emailTemplate は私が作成したばかりのモデルです。

var emailTemplate = new EmailModel 
{ 
    name = name,
    emailAddress = emailAddress,
    sent = "not Sent"
};    

htmlFromView = renderRazorViewToString("Template", emailTemplate);

これは、ビューから html の文字列を返すメソッドです。問題は、viewContext が null を返すことです。

private string renderRazorViewToString(string viewname, object model)
    {
        ViewData.Model = model;
        using (var sW = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewname);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sW);
            viewResult.View.Render(viewContext, sW);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sW.GetStringBuilder().ToString();

        }
    }

他のコントローラーから EmailController を呼び出さない場合、これは完全に機能します。コンテキストもモデルに渡す必要がありますか?

助けてくれてありがとう。

4

2 に答える 2

0

これはパーシャルに対して機能します。ビュー名を使用するだけで、非部分的にも機能すると思います。

protected string RenderPartialViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
       viewName = ControllerContext.RouteData.GetRequiredString("action");
    ViewData.Model = model;
    using (StringWriter sw = new StringWriter())
    {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);
         return sw.GetStringBuilder().ToString();
    }
 }
于 2013-05-12T00:31:01.327 に答える
0

私の問題は、別のコントローラーからアクション結果を呼び出していたため、他のアクション結果を呼び出していたそのコントローラーの株式検索場所でビューを探していたことに気付きました。

解決策: 他のアクション結果を呼び出しているコントローラーの在庫検索場所にビューを移動します。

于 2013-05-31T19:30:35.107 に答える