2009-10-15 100 views
1

我想爲我的項目添加一個導航菜單,它使用ASP.NET框架和C#編程語言。我的解決方案是創建一個小部件,當從母版頁調用時可以填充部分視圖。 在窗口小部件的操作方法中,如何將鏈接或控制器 - 操作組合添加到ViewDataDictionary?添加Html動作鏈接到ASP.NET MVC中的列表

---編輯:這是我的代碼,你的建議

public class NavController : Controller 
{ 
    public ActionResult Menu() 
    {   
     List<ActionLink> navLinks = new List<ActionLink>(); 
     navLinks.Add(new ActionLink() { Text = "Home", ActionName = "Index", ControllerName = "Home" }); 
     return View(navLinks);   
    } 
} 

局部視圖文件類似於以下後:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<Microsoft.Web.Mvc.Controls.ActionLink>>" %> 

<% foreach(var link in Model) { %> 
<%= link %> 
<%} %> 

但是這一切的輸出是簡單的「微軟.Web.Mvc.Controls.ActionLink「而不是我想要的鏈接。

謝謝。

回答

2

actionlink是某種類型的mvc控件,它可能是解析標籤的結果,然後會添加到頁面的控件集合中。

你有2個選擇來實現你的目標,傳遞你可以在控制器中使用Html.ActionLink(linkText,actionName)生成的完整鏈接(即完全形成的錨標籤)或將鏈接的詳細信息傳遞給你的部分並使用這些細節來生成鏈接(即傳遞包含鏈接細節的元素的枚舉)。

我個人更喜歡第二種方法,因爲它將導航邏輯與渲染分開。

在你的代碼

某處...

public class NavigationLink 
{ 
    public string Text; 
    public string Controller; 
    public string Action; 
    // ... any other properties you want to pass 
} 
在控制器

某處...

public ActionResult Menu 
{ 
    var links = new List<NavigationLink> 
    { 
    new NavigationLink 
    { 
     Text = "Home", 
     Controller = "Home", 
     Action = "Index" 
    }, 
    new NavigationLink 
    { 
     Text = "Logout", 
     Controller = "Authentication", 
     Action = "Logout" 
    } 
    }; 

    return View(links); 
} 
在你看來

某處...

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<NavigationLink>>" %> 

<% foreach(var link in Model) { %> 
<%= Html.ActionLink(link.Text, link.Action, link.Controller) %> 
<%} %> 
0

是你在找什麼?

List<ActionLink> actions = new List<ActionLink>(); //or = ViewData["actions"] for adding 
    actions.Add(new ActionLink() { ActionName = "actionname", ControllerName = "controller" }); 
    ViewData["actions"] = actions; 
+0

您好,感謝您響應。我嘗試了你的方法,但我確定我在這裏仍然做錯了什麼。請參閱上文。 – Dhruv 2009-10-15 16:04:29

+0

使用鏈接的RenderControl方法或ToString - 我現在無法測試。讓我們看看自己是哪一個呈現鏈接。 – twk 2009-10-15 16:33:11

+0

感謝您的時間,這在我的結尾也很不幸。在我重構其他代碼段的時候,我會在明天演示之後對其進行探討。 – Dhruv 2009-10-15 16:46:47

0

好吧,我想出了一個直接的方法,直接添加ViewData到字典。

public ActionResult Menu() 
{ 
ViewData.Add("one", "<a href=\"../Home/Index\">Home</a>"); 
ViewData.Add("two", "<a href=\"../Account/LogOff\">Log Off</a>"); 

return View(); 
} 

在局部視圖:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<ul> 
<% foreach (KeyValuePair<string, object> pair in ViewData) { %> 

<li> 
    <%=pair.Value %> 
</li> 

<%} %> 
</ul> 

未必是最聰明的方式來做到這一點,但它的作品。