0) { %>"-6ren">
gpt4 book ai didi

ASP.Net MVC 帮助重构

转载 作者:行者123 更新时间:2023-12-04 22:25:13 25 4
gpt4 key购买 nike

我对 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>

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

编辑:

我的所有 Controller 派生的 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 :使用 View 模型和强类型 View 而不是 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>
<% } %>

然后在您的主 View 中:
<div id="main-menu" class="menu">
<ul>
<%= Html.DisplayForModel() %>
</ul>
</div>

改进编号 3 :避免在 View 中编码业务规则。所以在你的 View 模型中添加一个属性:
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 帮助程序来呈现此 anchor ,因为在 View 中编写 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 MVC 帮助重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3940730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com