gpt4 book ai didi

asp.net-mvc-4 - 在 MVC4 中动态添加内容到布局

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

我有一个主布局文件,我的所有 View 都在其中呈现。我想使用以下规则向该布局的特定区域中的用户显示消息:

  1. 在我们的维护期内,在用户登录后在每个页面上显示警告。
  2. 在接近我们的维护期时,在用户登录后在每个页面上显示警告(但内容与#1 不同)
  3. 正常情况下,仅在登录时显示消息,后续页面不显示消息
  4. 我可能希望从其他 View / Controller 向此区域附加其他消息,但不想意识到我是否与维护警告重叠

我真的很难找到正确的方法来做到这一点。现在我有类似的东西:

public class LayoutController : Controller
{
[ChildActionOnly]
public IHtmlString GetMarginMessages() {
loadMaintenanceMessages();
var messages = this.ViewBag.MarginMessages.ToSingleString();
return new HtmlString(messages);
}

private List<string> loadMaintenanceMessages() {
if (withinMaintenancePeriod)
{
this.ViewBag.MarginMessages.Add("foo");
}
else if (nearMaintenancePeriod) {
this.ViewBag.MarginMessages.Add("bar");
}
}
}

然后在我的布局中我可以有:

<div id="marginMessage">@Html.Action("GetMarginMessages")</div>

在其他页面或 Controller 中,我可以:

this.ViewBag.MarginMessages.Add("Something")    // or have it go through a helper of sorts

这是思考这个问题的正确方法吗?我对使用 ViewBag 并不感到兴奋,但我没有看到更好的方法来管理 View 间/ Controller 共享。对每个 View 渲染进行维护时间段检查也感觉不太对。

我还缺少哪些其他选项?

最佳答案

为此,我在主布局 View 中有一个部分呈现一个单独的操作。有点像

(page stuff...)
<div id="marginMessages>
Html.Action("GetMarginMessages", "Infrastructure")
</div>
(more page stuff...)

您将 InfrastructureController 作为 Controller 来处理横切关注点,例如 margin 消息、通知消息等。该 Controller 将有一个方法 GetMarginMessages,它可以确定是否需要显示任何消息,如果需要,则返回一个局部 View ,其中包含按您希望的方式呈现的那些消息。如果没有消息,它可以返回 EmptyResult 并且您应该确保您的页面在 div 为空时看起来正常。

对于更复杂的逻辑,您可以创建一个派生自 ActionFilterAttribute 的 Action 过滤器,它在 Controller 方法 (OnActionExecuted()) 之后或 View 之前捕获请求呈现(OnResultExecuting())。 (理论上,您使用哪一个应该无关紧要。)

从那里,您可以使用 filterContext 来:

  • 查看用户刚刚点击了哪个 Controller 方法和操作
  • 查看 Controller 将哪些值放入模型、ViewBagTempData
  • 在模型、ViewBagTempData 中添加/删除/更改值

因此,从那里开始,您应该能够设置值来告诉您的消息呈现分部 View 它需要做什么。然后分部 View 可以检索这些值并根据需要使用它们(只记得在尝试使用它们之前对所有内容进行空检查)。

设置后,此操作过滤器可应用于:

  • 所有方法,通过将其添加到 Application_Start() 中的 GlobalFilterCollectionGlobal.asax.cs
  • 中的方法
  • 一个完整的 Controller ,将其添加到 Controller 文件中 public class MyController : Controller 行的上方
  • 一个特定的方法,通过在该方法之上添加它

当然,在这些地方的任何一个地方,您都可以将值传递给构造函数,并在过滤器中使用一些逻辑来确定哪个覆盖哪个。

关于asp.net-mvc-4 - 在 MVC4 中动态添加内容到布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18127501/

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