2009-07-09 103 views
1

有誰知道如何獲取當前文件夾的視圖被調用?我也使用AreasLib,所以我需要動態獲取它,而不用爲路徑加前綴。例如,如果我做http://localhost/myarea/mycontroller/myaction它會給我的路徑Project/Areas/myarea/Views/mysubsystem。所以,是的,它需要的是觀點是在文件夾ASP.NET MVC - 當前文件夾的視圖

編輯:這是不是說,或編輯MvcSiteMap源代碼來處理AreasLib。我沒有真正具備這些技能,或者更重要的是要處理它。

FINAL

這不是很漂亮,但我沒有選擇任何責任。我使用部分視圖來渲染菜單組件,使用以下幫助程序找到正確的。我沒有在這個版本中處理丟失的menu.ascx文件,但是現在我們假設總是會有一個文件。

using System; 
using System.Web; 
using System.Runtime.CompilerServices; 
using System.Web.Mvc; 

namespace Intranet.Helpers 
{ 
    public static class StaticMenuHelper 
    { 
    public static string StaticMenu(this HtmlHelper helper, string area, string controller) 
    { 
     if (area.Equals("root")) 
     { 
     return "/Views/" + controller + "/menu.ascx"; 
     } 
     else 
     { 
     return "/Areas/" + area + "/Views/" + controller + "/menu.ascx"; 
     } 
    } 
    } 
} 

以下在我的Site.Master

<div id="menu"> 
    <% Html.RenderPartial(Html.StaticMenu(ViewContext.RouteData.Values["area"].ToString(), ViewContext.RouteData.Values["controller"].ToString())); %> 
</div> 

直到MvcSiteMap已經成熟到一些東西,可以處理AreasLib那麼我將不得不使用這一點。我真的,真的沒有時間去修改那個lib。

感謝您的幫助。

+0

你的最終遊戲是什麼? – 2009-07-09 16:22:47

+0

你不想知道;)基本上,因爲我使用Phil Haack的AreasLib,這意味着我不能使用MvcSiteMap,這意味着我無法動態生成我的網站導航。我身陷lim。。所以我得到的路徑,所以我會鏈接到menu.aspx文件,讓我回到我需要的菜單選項。討厭的,但它們本質上是一種觀點,所以它並不是那麼糟糕。 – Kezzer 2009-07-09 16:24:44

+0

AreasLib?那是什麼? – 2009-07-09 17:06:29

回答

2

好吧,在我看來,如果你從一個特定的控制器調用視圖,那麼根據你已經知道的構建路徑將是非常簡單的。如果您在視圖中需要它,則可以使用ViewData條目將它傳遞給它。

所以,如果你做

http://localhost/myarea/mycontroller/myaction 

那麼您呼叫到控制器已經知道myarea,myController的,和myaction。我假設你正在構建一個局部視圖或一個Html幫助器方法來處理菜單,所以當你渲染你的視圖的時候,把myarea,mycontroller和myaction作爲ViewData變量傳遞到視圖中。在你看來,將這些變量傳遞給你的局部視圖或Html輔助方法。

或者,您可以從myarea,mycontroller和myaction構建您的路徑,並將整個路徑推送到您的視圖中。

用法:

<%= Html.Menu(ViewData["Area"], ViewData["Controller"], ViewData["Action"]) %> 

實施例的函數來計算路徑:

string GetPath(string area, string controller, string action) 
{ 
    return "/project/areas/" + area + "/" + controller + "/" + action 
} 

編輯:克雷格斯頓茨指出的那樣,可以得到在一個視圖(經由ViewContext)未經路由值必須先將它們放入ViewData中。這意味着您可以直接在菜單擴展方法中構建路徑,前提條件是您可以通過相同方式獲得區域。我不確定菲爾的東西是否支持。

ViewContext.RouteData.Values["controller"].ToString() 
ViewContext.RouteData.Values["action"].ToString() 
1

這與視圖的命名空間不一樣嗎?這很容易從視圖本身進行檢查。