【发布时间】:2016-02-19 22:54:49
【问题描述】:
我的项目中有这样的控制器系统:
BaseController : Controller
AnyController : Controller
代码在我的基地Controller:
protected ViewResult View(string viewName, BaseViewModel model)
{
model.PromoBannerContent = _service.GetPromoBannerContent();
return base.View(viewName, model);
}
BaseViewModel - 这是layout model。以及简单Action的例子:
public virtual ActionResult UpdateAccount()
{
AccountViewModel account = _accountService.GetUser(Luxedecor.User.UserId).ToAccountViewModel();
return View(MVC.Account.Views.UpdateAccount, new
UpdateAccountViewModel()
{
AccountJson = JsonConvert.SerializeObject(account),
States = _accountService.GetStates(account.Country)
});
}
在哪里UpdateAccountViewModel : BaseViewModel。所以我的布局页面看起来像这样:
@model Luxedecor.ViewModel.BaseViewModel
@if (Model.PromoBannerContent != null)
{
...//Some html code
}
它工作正常,但我需要在所有控制器页面上都呈现 html 促销横幅。我的意思是我有例如AccountController: BaseController,我不需要这个横幅AccountController 视图。所以我可以在我的 BaseViewModel 中创建boolean 属性,并从AccountController 和其他Contollers 中的每个Action 传递它...但我想知道对于这个问题是否存在更优雅的解决方案?有经验的人可以帮帮我吗?
所以,这就是我所使用的解决方案:
public class RenderPromoBanner : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewBag.EnableBanner = true;
}
}
然后我刚刚在布局上使用了一个if 语句。
【问题讨论】:
-
您需要将
boolean属性传递给视图,但要自动执行此操作,一种选择是使用ActionFilterAttribute(例如)[RenderBanner],将其应用于相关控制器.请参阅 this answer 以获取您可以适应的示例 -
我可以使用控制器的属性(不是视图)吗?
-
是的,您可以将属性应用于控制器(应用于所有方法)或仅应用于控制器中的单个方法。
-
感谢您的宝贵时间。如果有帮助,我会尽力告诉你!
-
很高兴 - 您可能想添加自己的答案(或附加到已接受的答案)以及您为他人的利益而尝试过的代码
标签: c# asp.net-mvc