使用Html Helper创建
本文关键字:创建 Helper Html 使用 | 更新日期: 2023-09-27 18:07:53
我想创建一个Html助手,将显示内部内容,只有当用户在角色,像这样:
@using(Html.AdminBlock()) {
}
只有当user在role…
我该怎么做?
如果你不明白我在这里的意思,我希望这两个代码将返回相同的结果:
@if(Html.IsUserInRole("Admin")) {
<span>hey</span>
}
.
@using(Htm.RoleBlock()) {
<span>hey</span>
}
您正在尝试做的是不可能与返回IDisposable
的HTML帮助器。这样做的原因是它的主体将始终呈现。您不能有条件地将正文排除在这样的语句中:
@using(Htm.RoleBlock()) {
<span>hey</span>
}
此外,下面的代码看起来足够可读:
@if(Html.IsUserInRole("Admin")) {
<span>hey</span>
}
或者您可以编写一个将返回布尔值的助手,可以这样使用:
@if(Html.IsAdmin()) {
<span>hey</span>
}
更新2
所以你想保持尽可能多的逻辑在视图之外,在这种情况下,你可以把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")) {
...
}
创建自定义帮助器
我在去年的博客上发表了一篇关于这个话题的文章。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())
{
...
}