我正在使用MVC 2.
我有一个每个Controller使用的BaseController类.在此基本控制器类中,有一个名为IsAdministrator的属性.我需要在我的视图的HTML部分中使用此方法.我该怎么做?
编辑:
我的BaseController中的属性定义如下:
public bool IsAdministratorUser
{
get { return ... }
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 15
一种方法是使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
在你看来:
<% if (Html.IsAdministrator()) { %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
更新:
@jfar关于MVC范式的评论是正确的.以下是您在实践中可以执行的操作.您可以定义所有视图模型派生自的基本视图模型类:
public class BaseViewModel
{
public bool IsAdministrator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后编写一个自定义操作过滤器属性,该属性将在操作后执行并设置属性:
[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;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后一部分是用这个属性装饰BaseController:
[AdministratorInjector]
public abstract class BaseController : Controller
{
public bool IsAdministrator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
最后,如果您的视图被强类型化为BaseViewModel可以直接使用该IsAdministrator属性的模型:
<% if (Model.IsAdministrator) { %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
可能比HTML助手多一些代码,但是你对尊重MVC范式的意识将会很清楚.
| 归档时间: |
|
| 查看次数: |
3527 次 |
| 最近记录: |