3

私の ASP.NET MVC4 では、ViewBag.PageTitle を設定することで、コントローラーが現在のページ タイトルを設定できるようにしています。しかし

パート 1. ViewBag.PageTitle が ChildAction に設定されている場合は機能しません (_Layout.cshtml には表示されません)。ChildAction からページ タイトルを設定するにはどうすればよいですか?

パート 2. キャッシュされるとアクションが呼び出されなくなるため、キャッシュされた ChildAction にページ タイトルを設定するにはどうすればよいですか?

ありがとう!

public ActionResult Product(long productId)
{
    ViewBag.PageTitle="test";   //Works
    return View(productId);
}

[OutputCache(Duration=300)]
[ChildActionOnly]
public ActionResult ProductPartial(long productId)
{
    Product product=AProductProvider.Instance.GetProduct(productId);
    ViewBag.PageTitle=product.Name; //Doesn't work

    return View(product);
}
4

1 に答える 1

6

ControllerContext.ParentActionViewContext親ビューに関する情報を取得するために使用できます。

[OutputCache(Duration = 300)]
[ChildActionOnly]
public ActionResult ProductPartial(long productId)
{
    Product product = AProductProvider.Instance.GetProduct(productId);
    ControllerContext.ParentActionViewContext.ViewBag.PageTitle = product.Name;

    return View(product);
}

更新:これを機能させるには、親ビューで ViewData を次のように呼び出す必要があります。

@ViewContext.ViewData["PageTitle"]

理由はちょっと不明。子アクションは、親アクションの ViewData (オブジェクトの同じインスタンス) への適切な参照を受け取りますが、すべてのビュー(ViewPage) は、メソッドでのビューの初期化中に元の ViewData が持っている状態で ViewData のコピーSytem.Web.Mvc.Html.TemplateHelpers.TemplateHelperを受け取ります。親ページの ViewData は、子アクションへの呼び出しが発生する前に初期化/コピーされるため、子アクションでのその後の更新は適用されません。これは、それを行う MVC のソース コードです。

// ....
ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData)
{
    Model = metadata.Model,
    ModelMetadata = metadata,
    TemplateInfo = new TemplateInfo
    {
        FormattedModelValue = formattedModelValue,
        HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName),
        VisitedObjects = new HashSet<object>(html.ViewContext.ViewData.TemplateInfo.VisitedObjects), // DDB #224750
    }
};

ただし、ViewContextController コンテキスト データへのコピーではなく、参照を保持するため、それを使用できます。一方、 を使用する場合はViewContext.ViewData、ビュー、子アクション、セクション、レイアウトの実行順序に注意する必要があります...

于 2013-10-04T23:40:31.407 に答える