我對ASP.Net和MVC都很陌生。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不錯的改進流程! – 2010-10-15 09:04:07
問題是我將BusinessObjects用作大多數視圖的模型。 MainMenu(和一個ContextMenu)是ApplicationControlLer上的屬性,並在執行ActionResult之前分配給ViewData。當然,我可以做一個ApplicationViewData,它將業務對象作爲類型參數。但是,這並不是一個乾淨的解決方案,因爲控制器中的屬性和母版頁中使用ViewData [「MainMenu」],因爲只有母版頁受到後者的影響。我喜歡你的解決方案,但是我怎樣才能使用它,而不必使用輸入視圖? –
jgauffin
2010-10-15 09:28:19
如果它在主頁面中,則表示所有視圖都需要此屬性。因此,您可以使所有視圖模型都從包含菜單屬性的基本視圖模型派生。然後可以將此屬性填充到操作篩選器中,以避免在所有操作中執行此操作,然後可以強制將此母版頁鍵入到此基本視圖模型中。 – 2010-10-15 09:30:35