我想创建Html帮助器,只有当用户在角色中时才显示内部内容, 像这样:
@using(Html.AdminBlock()) {
}
只有用户处于角色中时才会显示块中的代码...
我该怎么做?
如果您不明白我的意思,我希望这两个代码会返回相同的结果:
@if(Html.IsUserInRole("Admin")) {
<span>hey</span>
}
@using(Htm.RoleBlock()) {
<span>hey</span>
}
答案 0 :(得分:1)
使用返回IDisposable
的HTML帮助程序无法实现您的目的。这样做的原因是因为它的主体将始终被渲染。您不能有条件地排除身体在这样的陈述中被渲染:
@using(Htm.RoleBlock()) {
<span>hey</span>
}
此外,以下内容看起来足够可读:
@if(Html.IsUserInRole("Admin")) {
<span>hey</span>
}
或者您可以编写一个将返回布尔值的帮助器,并且可以像这样使用:
@if(Html.IsAdmin()) {
<span>hey</span>
}
答案 1 :(得分:0)
因此,您希望尽可能多地保留视图中的逻辑,在这种情况下,您可以将if条件从视图中拉出并转换为HtmlHelper
扩展方法。
public static class HtmlHelperExtensions
{
public static bool IsAdmin(this HtmlHelper htmlHelper)
{
return htmlHelper.ViewContext.HttpContext.Current.User.IsInRole("admin");
}
}
用法:
@if (Html.IsAdmin()) {
...
}
如果你想要只输出某个东西,如果一个用户在角色中,那么这种助手就完全有点过分了。您应该在视图中查看简单的if
语句。
@if (HttpContext.Current.User.IsInRole("admin")) {
...
}
我去年发布了一个关于这个主题的blog post,我打开了ASP.NET MVC源代码,看看BeginForm()
是如何组合在一起制作的。以下是重点,这将允许您在MVC视图中围绕块包裹<div>
。
public class MvcDiv : IDisposable
{
private bool _disposed;
private readonly FormContext _originalFormContext;
private readonly ViewContext _viewContext;
private readonly TextWriter _writer;
public MvcDiv(ViewContext viewContext)
{
if (viewContext == null)
{
throw new ArgumentNullException("viewContext");
}
_viewContext = viewContext;
_writer = viewContext.Writer;
_originalFormContext = viewContext.FormContext;
viewContext.FormContext = new FormContext();
Begin();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Begin()
{
_writer.Write("<div>");
}
private void End()
{
_writer.Write("</div>");
}
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
_disposed = true;
End();
if (_viewContext != null)
{
_viewContext.OutputClientValidation();
_viewContext.FormContext = _originalFormContext;
}
}
}
public void EndForm()
{
Dispose(true);
}
}
然后将此扩展方法放在某处:
public static class HtmlHelperExtensions
{
public static MvcDiv BeginDiv(this HtmlHelper htmlHelper)
{
return new MvcDiv(htmlHelper.ViewContext);
}
}
然后你可以像这样使用它:
@using (Html.BeginDiv())
{
...
}