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() %> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 在IIS中启用内容过期可能有什么缺点?
- 配置 – 升级到ASP.NET 4.5后出现404错误
- asp.net-mvc – 使用razor引擎在mvc4中重写url
- asp.net – 如何在没有查找AspNetUserRoles表的情况下获取W
- msbuild – 为什么aspnet_compiler需要对构建服务器上的Tem
- razor – ASP.NET MVC 4 – for循环帖子模型集合属性,但for
- ASP.NET MVC – IsAjaxRequest()实际上意味着什么?
- asp.net – 在ListView中设置最后一项的样式
- asp.net – 在静态Web方法中调用ResolveClientUrl(ASPNet W
- 如何在ASP.NET中自定义发布?
推荐文章
站长推荐
- 一款经典的ajax登录页面 后台asp.net
- asp.net – 仅在本地IIS服务器上支持创建虚拟目录
- asp.net-mvc-3 – Hz.Raw()的Razor替代品
- 如何在ASP.NET中设置TextBox中的对齐中心?
- asp.net-mvc – 为什么调用base.OnActionExecuti
- asp.net-mvc – Domain Driven Design新手,请简要
- asp.net – 可以添加一个String.contains多个值吗
- ASP.NET Core和Angular的RDLC本地报表查看器(> 2
- asp.net – 加速自动完成的Web服务并避免过多的方
- asp.net-mvc – 如何在ASP.NET MVC中为自定义Use
热点阅读