加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.Net MVC帮助重构

发布时间:2020-12-16 07:31:22 所属栏目:asp.Net 来源:网络整理
导读:我对ASP.Net和MVC都很陌生. 我在母版页中获得了以下代码: div id="main-menu" class="menu" % var items = (IListCompanyName.Framework.Web.MenuItem)ViewData["MainMenu"]; if (items.Count 0) { %ul% foreach (var item in items) { if (!string.IsNullO
我对ASP.Net和MVC都很陌生.

我在母版页中获得了以下代码:

<div id="main-menu" class="menu">
  <%
   var items = (IList<CompanyName.Framework.Web.MenuItem>)ViewData["MainMenu"];
   if (items.Count > 0)
   {
    %><ul><%
    foreach (var item in items)
    {
     if (!string.IsNullOrEmpty(item.RequiredRole) && !System.Threading.Thread.CurrentPrincipal.IsInRole(item.RequiredRole))
      continue;

     %><li><a href="<%= item.Uri %>"><%= item.Title %></a></li><%
    }
    %></ul><%
   }
  %>
 </div>

我可以将代码移动到另一个文件或以任何方式重构代码吗?

编辑:

我的ApplicationController,所有控制器派生:

public class ApplicationController : Controller
{
    List<MenuItem> _mainMenu = new List<MenuItem>();
    List<MenuItem> _contextMenu = new List<MenuItem>();

    protected IList<MenuItem> MainMenu
    {
        get { return _mainMenu; }
    }

    protected IList<MenuItem> ContextMenu
    {
        get { return _contextMenu; }
    }

    protected string PageTitle { get; set; }

    protected override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        ViewData["PageTitle"] = PageTitle;
        ViewData["MainMenu"] = MainMenu;
        ViewData["ContextMenu"] = ContextMenu;
        base.OnResultExecuting(filterContext);
    }
}

解决方法

以下是一些建议:

改进号1:使用视图模型和强类型视图而不是ViewData

public ActionResult Index()
{
    // TODO: Fetch this data from a repository
    var menus = new[] {
        new MenuItem(),new MenuItem()
    }.ToList();

    return View(menus);
}

然后在你看来:

<div id="main-menu" class="menu">
    <%
        if (Model.Count > 0)
        {
            %><ul><%
            foreach (var item in Model)
            {
                if (!string.IsNullOrEmpty(item.RequiredRole) && !System.Threading.Thread.CurrentPrincipal.IsInRole(item.RequiredRole))
                    continue;

                %><li><a href="<%= item.Uri %>"><%= item.Title %></a></li><%
            }
            %></ul><%
        }
    %>
</div>

仍然可怕和完全不可读的标签汤.

改进2:使用编辑/显示模板:

在?/ Views / Home / DisplayTemplates / MenuItem.ascx中:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyName.Framework.Web.MenuItem>" %>

<% if (!string.IsNullOrEmpty(Model.RequiredRole) &&
       System.Threading.Thread.CurrentPrincipal.IsInRole(Model.RequiredRole)) { %>
    <li>
        <a href="<%= Model.Uri %>"><%= Model.Title %></a>
    </li>
<% } %>

然后在主视图中:

<div id="main-menu" class="menu">
    <ul>
        <%= Html.DisplayForModel() %>
    </ul>
</div>

改进3:避免在视图中编写业务规则.所以在你的视图模型中添加一个属性:

public bool IsLinkVisible
{
    get
    {
        return !string.IsNullOrEmpty(RequiredRole) &&
               Thread.CurrentPrincipal.IsInRole(RequiredRole);
    }
}

这样你的显示模板现在看起来像这样:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyName.Framework.Web.MenuItem>" %>
<% if (Model.IsLinkVisible) { %>
    <li>
        <a href="<%= Model.Uri %>"><%= Model.Title %></a>
    </li>
<% } %>

改进4:编写自定义HTML帮助器来渲染此锚点,因为在视图中编写C#仍然是丑陋且不可测试的:

public static class HtmlExtensions
{
    public static MvcHtmlString MenuItem(this HtmlHelper<MenuItem> htmlHelper)
    {
        var menuItem = htmlHelper.ViewData.Model;
        if (!menuItem.IsLinkVisible)
        {
            return MvcHtmlString.Empty;
        }
        var li = new TagBuilder("li");
        var a = new TagBuilder("a");
        a.MergeAttribute("href",menuItem.Uri);
        a.SetInnerText(menuItem.Title);
        li.InnerHtml = a.ToString();
        return MvcHtmlString.Create(li.ToString());
    }
}

最后你的显示模板:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyName.Framework.Web.MenuItem>" %>
<%= Html.MenuItem() %>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读