gpt4 book ai didi

c# - 在 ASP.NET MVC 中通过子操作设置页面标题

转载 作者:行者123 更新时间:2023-12-04 02:10:06 25 4
gpt4 key购买 nike

在我的 ASP.NET MVC4 中,我允许 Controller 通过设置 ViewBag.PageTitle 来设置当前页面标题。但是

第 1 部分。在 ChildAction 中设置 ViewBag.PageTitle 时不起作用(_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);
}

最佳答案

您可以使用 ControllerContext.ParentActionViewContext 检索有关父 View 的信息:

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

return View(product);
}

更新:要使其正常工作,您必须在您的父 View 中像这样调用 ViewData:

@ViewContext.ViewData["PageTitle"]

原因有点晦涩。子 action 收到对父 action 的 ViewData(对象的同一实例)的正确引用,但每个 view (ViewPage) 都收到状态中 ViewData 的副本原始 ViewData 在 Sytem.Web.Mvc.Html.TemplateHelpers.TemplateHelper 方法中进行 View 初始化。父页面的 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
}
};

但是,ViewContext 保留引用,而不是复制到 Controller 上下文数据,因此您可以使用那个。另一方面,如果您使用 ViewContext.ViewData,则必须了解 View 、子操作、部分、布局的执行顺序...

关于c# - 在 ASP.NET MVC 中通过子操作设置页面标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19192198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com