2010-09-30 31 views
0

我正在使用MVC 2.在视图中使用的基本控制器的属性

我有一个每个控制器使用的BaseController类。在这个基础控制器类中有一个名为IsAdministrator的属性。我需要在我的视图的HTML部分中使用此方法。我将如何做到这一点?

编辑:

我在我的BaseController财产的定义是这样的:

public bool IsAdministratorUser 
{ 
    get { return ... } 
} 
+0

根据达林的回答如下,但在这种情况下,省略括号,即<%if(Html.IsAdministratorUser ){%> – 2010-09-30 10:34:20

回答

14

的一种方法是使用一个HTML帮助:

public static class HtmlExtensions 
{ 
    public static bool IsAdministrator(this HtmlHelper htmlHelper) 
    { 
     var controller = htmlHelper.ViewContext.Controller as BaseController; 
     if (controller == null) 
     { 
      throw new Exception("The controller used to render this view doesn't inherit from BaseContller"); 
     } 
     return controller.IsAdministrator; 
    } 
} 

而在你的看法:

<% if (Html.IsAdministrator()) { %> 

<% } %> 

更新:

@ jfar关于MVC范式的评论是正确的。以下是您在实践中可以执行的操作。你可以定义你的所有视图模型派生自基础视图模型类:

public class BaseViewModel 
{ 
    public bool IsAdministrator { get; set; } 
} 

,然后写一个自定义的行为过滤属性将动作后执行,并设置属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class AdministratorInjectorAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     var result = filterContext.Result as ViewResultBase; 
     if (result != null) 
     { 
      // the action returned a strongly typed view and passed a model 
      var model = result.ViewData.Model as BaseViewModel; 
      if (model != null) 
      { 
       // the model derived from BaseViewModel 
       var controller = filterContext.Controller as BaseController; 
       if (controller != null) 
       { 
        // The controller that executed this action derived 
        // from BaseController and posses the IsAdministrator property 
        // which is used to set the view model property 
        model.IsAdministrator = controller.IsAdministrator; 
       } 
      } 
     } 
    } 
} 

而且最后一部分是与此属性装饰BaseController:

[AdministratorInjector] 
public abstract class BaseController : Controller 
{ 
    public bool IsAdministrator { get; set; } 
} 

最后,如果你的看法是强类型的,以从派生的模型你可以直接使用IsAdministrator属性:

<% if (Model.IsAdministrator) { %> 

<% } %> 

可能比HTML帮助更多的代码,但是你要尊重MVC模式将是明确的意识。

+0

+1 darin,像往常一样好:)。我想补充一点,如果它将被用在视图中的一些地方,那么将这种助手调用缓存到变量中也很有用。即<%bool isAdminUser = Html.IsAdministrator();%>,然后只需参考<%if(isAdminUser){%> etc等。 – 2010-09-30 09:26:24

+0

@Darin:你是MVC的一个棺材:) – 2010-09-30 09:48:29

+0

@Darin:How我会让IsAdministrator显示在Html助手中吗?它现在不在吗? – 2010-09-30 09:51:53

相关问题