私はMVCアプリケーションで1つのコントローラアクションごとに作業することを好みますが、「コントローラ」ごとに1つのフォルダでビューフォルダを構造化できるはずです。Razor View Engineの表示位置を無効にする
AdminLoginControllerおよび/ Admin/Indexという名前のAdminIndexControllerにマップされるクラスにマップされる/ Admin/Loginのようなルートを使用します。しかし、私は、私は1つのフォルダをAdminと呼ばれるように私のビューフォルダを構造化したいと思うし、2つのファイルlogin.cshtmlとindex.cshtmlと呼ばれる。
これを行うには、ViewEngineをオーバーライドする必要があるようです。私には、次のコードで作業を持っている:私は特に、ベース・ビュー・エンジンは、私が取るしたいのですが、キャッシングなどの束を行い、より良い方法があるのかどうかを知りたいのですが
public class MyViewEngine : RazorViewEngine
{
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
var controllerTypeName = controllerContext.RouteData.GetRequiredString("controller");
var controllerParts =_GetControllerNameParts(controllerTypeName);
var folderName = controllerParts.Take(controllerParts.Length - 1).Aggregate((s1, s2) => s1 + s2);
viewName = controllerParts[controllerParts.Length - 1];
var filename = _GetFilename(folderName, viewName, controllerContext);
return new ViewEngineResult(CreateView(controllerContext, filename, masterName), this);
}
private string[] _GetControllerNameParts(string controllerTypeName)
{
var r = new Regex(@"
(?<=[A-Z])(?=[A-Z][a-z]) |
(?<=[^A-Z])(?=[A-Z]) |
(?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);
return r.Split(controllerTypeName);
}
private string _GetFilename(string folderName, string viewName, ControllerContext controllerContext)
{
var path = string.Format("~/Views/{0}/{1}.cshtml", folderName, viewName);
var filename = controllerContext.HttpContext.Server.MapPath(path);
if (File.Exists(filename)) { return path; }
return null;
}
}
の利点。
誰かが似たようなことをしましたか?
おかげで、 マット