【问题标题】:Render html block depending on the controller heir in C# MVC根据 C# MVC 中的控制器继承人呈现 html 块
【发布时间】: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


【解决方案1】:

如果您需要根据每个操作来决定是否需要横幅(例如,控制器中的某些操作需要横幅,而同一控制器中的其他操作不需要),则操作需要传达是否横幅需要。使用boolean 是一个可行的选择。此外,如果需要横幅,您可以将对 _service.GetPromoBanner 的调用移动到 Action 中并在那里设置模型属性。

如果控制器中的所有动作都需要横幅,您还可以为需要横幅的控制器创建另一个子类。这个新的子类继承自BaseController,并包含获取横幅内容的代码。如果控制器需要横幅,则从 BannerController 派生,否则从 BaseController 派生:

class BaseController : Controller
{
    protected virtual ViewResult View(string viewName, BaseViewModel model)
    {   
        return base.View(viewName, model);
    }    
}

class BannerController : BaseController
{
    protected virtual ViewResult View(string viewName, BaseViewModel model)
    {   
        model.PromoBannerContent = _service.GetPromoBannerContent();               
        return base.View(viewName, model);
    }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2014-01-26
    相关资源
    最近更新 更多