[英]Creating using Html Helper
我想創建Html幫助程序,僅當用戶擔任角色時才顯示內部內容,如下所示:
@using(Html.AdminBlock()) {
}
並且僅當用戶擔任角色時,才會顯示塊中的代碼...
我該怎么做?
如果您不理解我的意思,那么我希望這兩個代碼返回相等的結果:
@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>
}
因此,您希望在視圖中保持盡可能多的邏輯,在這種情況下,您可以將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")) {
...
}
去年,我發布了有關此主題的博客文章 ,在那里我打開了ASP.NET MVC源代碼,以了解BeginForm()
是如何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())
{
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.