多くの Web アプリケーションを拡張するための一般的なコントローラー、_Layout.cshtml、css、および js を含む一般的な ASP.MVC (c# および razor) ベース プロジェクトを作成しようとしています。
MvcContrib を使用してポータブル領域を作成するのが最善の策だと思いました
というわけでフォルダ設定は大体こんな感じ
BaseProj
- コンテンツ
- js
- プラグイン
- その他
- 画像
- ふー
- CSS
- js
- コントローラー
- ビュー
MainProj
- コンテンツ
- コントローラー
- ビュー
このURLが機能するように、PortableAreaRegistrationクラスを拡張してBaseProj領域を登録しています(MvcContribドキュメントに従って)...
htttp://localhost/MainProj/BaseProj/
PortableAreaRegistration の MvcContrib コードを見ると、コンテンツの下に 3 つの静的ルート (画像、スタイル、スクリプト) も登録されます。
したがって、このURLも正常に機能します...
htttp://localhost/MainProj/BaseProj/images/bar.jpg
また、サブフォルダーは、スラッシュの代わりにドットを使用した場合にのみ正常に機能します... htttp://localhost/MainProj/BaseProj/images/foo.bar.jpg
ただし、画像、css、js などの下にサブフォルダーを作成して整理すると非常に便利です。ただし、これらのサブフォルダーは 404 になります
つまり、これは機能しません.... htttp://localhost/MainProj/BaseProj/images/foo/bar.jpg
問題は、画像の下にサブフォルダーをどのようにマップするかです (ドット表記なしで)。つまり、これは機能します.... htttp://localhost/MainProj/BaseProj/images/foo/bar.jpg
ありがとう
編集:
ちょっと考えて、解決策を見つけました。MvcContrib.Portable Areas にデフォルトでこのようなものが含まれているのではないでしょうか。
最初に BaseProjRegistration.cs ですべてのルートをキャッチして、Content のすべてのサブフォルダーをキャッチします。
public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
{
...
//static controller with catch all for all subfolders of content
context.MapRoute(
"BaseProjContent",
"BaseProj/Content/{*resourceName}",
new { controller = "Content", action = "LoadContent", resourcePath = "Content" }
);
...
}
次に、MvcContrib.PortableAreas.EmbeddedResourceController を拡張する BaseProj に ContentController クラスを作成します。
これにより、スラッシュがドットに変換され、BaseProj コンテンツが DLL からロードされます。つまり、/BaseProj/Content/images/foo/bar.jpg => /BaseProj/Content/images.foo.bar.jpg
public class ContentController : MvcContrib.PortableAreas.EmbeddedResourceController
{
public ActionResult LoadContent(string resourceName, string resourcePath)
{
string actualResourceName = resourceName.Replace("/", ".");
return base.Index(actualResourceName, resourcePath);
}
}
これは私にとってはうまくいきましたが、多くのWebアプリケーションを拡張するための共通の基本プロジェクトをセットアップする方法に関する他の推奨事項は大歓迎です.