2009-07-09 23 views
1

ビューの現在のフォルダを取得する方法を知っている人はいますか?私はAreasLibも使っているので、パスのプレフィックスを付けずに動的に取得する必要があります。たとえば、http://localhost/myarea/mycontroller/myactionを入力すると、Project/Areas/myarea/Views/mysubsystemというパスが表示されます。そうそう、それはビューがであることをフォルダにする必要があるASP.NET MVC - ビューの現在のフォルダ

EDIT:それはどちらかだこと、またはAreasLibに対処するためのMvcSiteMapソースコードを編集します。私は本当にスキルを備えていない、またはそれを処理するためにもっと重要な時間です。

FINAL

それはきれいではありませんが、私は全く選択の余地がなかったです。私は、部分的なビューを使用して、次のヘルパーを使ってメニューコンポーネントをレンダリングし、正しいものを探しています。私はこのバージョンでは欠けているmenu.ascxファイルを扱っていませんが、今のところ常に1つあると仮定しています。

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の中では、 MvcSiteMapまで

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

はその後、私はこれを使用する必要がありますAreasLibに対処することができるものへと成長しました。私は本当に、本当にそのlibを変更する時間がありません。

ありがとうございました。

+0

あなたの最終ゲームは何ですか? –

+0

あなたは知りたくありません;)基本的にPhil HaackのAreasLibを使用しているため、私はMvcSiteMapを使用できません。つまり、私のサイトナビゲーションを動的に生成できません。私はリムボーにいる。だから私はパスを得る代わりに、必要なメニューオプションを返すmenu.aspxファイルにリンクします。しかし、それは本質的に見ているので、それほど悪くはありません。 – Kezzer

+0

AreasLib?あれは何でしょう? –

答えて

2

まあ、特定のコントローラからビューを呼び出す場合は、すでに知っているものからパスを構築するのはかなり簡単なことです。ビューに必要な場合は、ViewDataエントリを使用して渡すことができます。

だから、あなたは

http://localhost/myarea/mycontroller/myaction 

を行うならば、あなたに呼び出しているコントローラは、すでにmyarea、mycontroller、およびmyactionを知っています。私はあなたがViewをViewData変数としてビューにmyarea、mycontroller、およびmyactionを渡すときに、メニューを扱うための部分的なビューまたはHTMLヘルパーメソッドを構築していると仮定します。ビューでは、これらの変数を部分ビューまたは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 
} 

EDIT:クレイグStuntzが指摘したように、あなたはなし(ViewContext経由)ビューのルート値を得ることができます最初にViewDataに配置する必要があります。つまり、エリアと同じ方法で、メニュー拡張メソッドでパスを直接構築することができます。私はPhilのものがそれをサポートしているかどうかは分かりません。

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

好ましくはHtmlHelperなので、私はちょうどHtmlをやることができます。メニュー()をクリックしてください。私が得る問題は、パラメータなしでURLを取得することです。そして、AreasLibを使用すると、コントローラはAreasフォルダに入れ子になっているので、URL http:// localhost/accounts/contracts/mypage/paramは実際にプロジェクト/エリア/アカウント/ contract – Kezzer

+1

最初にViewDataに配置することなく、(ViewContext経由で)ビュー内でルート値を取得できます。 –

+0

クレイグクレイグとロバート – Kezzer

1

これはビューのネームスペースと同じではありませんか?ビュー自体から検討するだけでも簡単です。

+0

あなたは正しいかもしれませんが、私は明日まで私の開発ボックスにいません。 – Kezzer

+0

CodeBehindを持っているかどうかによってこれが異なるかもしれません。私は見たことがない。 –

関連する問題