1

コントローラーを作成します。

public abstract class MyBaseController : Controller
{
   public ActionResult MyAction(string id)
   {
      return View();
   }
}

MyBaseController から継承する別の特定のコントローラーを作成するよりも:

public class MyController : MyBaseController 
{

}

Views/MyBaseController フォルダーに MyAction.aspx というビューがあります。次に、MyController/MyAction メソッドを呼び出します。次の例外が生成されます。

ビュー 'MyAction' またはそのマスターが見つかりませんでした。次の場所が検索されました: ~/Views/MyController/MyAction.aspx ~/Views/MyController/MyAction.ascx ~/Views/Shared/MyAction.aspx ~/Views/Shared/MyAction.ascx

Views/MyBaseController フォルダーのビューを使用するように MVC.NET を作成できますか?

4

3 に答える 3

3

より巧妙な回答を待つ必要がありますが、これは機能します:

デフォルトのビュー エンジンに基づいて新しいビュー エンジンを作成し、FindViewMethod を次のようにオーバーライドします。


 public class MyNewViewEngine : WebFormViewEngine
 {
     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
     {
        var type = controllerContext.Controller.GetType();

            //Retrieve all the applicable views.
            var applicableViews = from m in type.GetMethods()
                                  where typeof(ActionResult).IsAssignableFrom(m.ReturnType) & m.Name == viewName
                                  select m;

            //Save the original location formats.
            var cacheLocations = ViewLocationFormats;
            var tempLocations = cacheLocations.ToList();

            //Iterate over applicable views and check if they have been declared in the given controller.
            foreach(var view in applicableViews)
            {
                //If not, add a new format location to the ones at the default engine.
                if (view.DeclaringType != type)
                {
                    var newLocation = "~/Views/" + view.DeclaringType.Name.Substring(0, view.DeclaringType.Name.LastIndexOf("Controller")) + "/{0}.aspx";
                    if (!tempLocations.Contains(newLocation))
                        tempLocations.Add(newLocation);
                }
            }

            //Change the location formats.
            ViewLocationFormats = tempLocations.ToArray();

            //Redirected to the default implementation
            var result = base.FindView(controllerContext, viewName, masterName, useCache);

            //Restore the location formats
            ViewLocationFormats = cacheLocations;

            return result;
   }
}

新しいビュー エンジンを追加します。


 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new MyNewViewEngine());
            RegisterRoutes(RouteTable.Routes);
        }
    }

お役に立てれば

于 2010-10-21T13:42:11.287 に答える
0

サブコントローラーのコンテキストにいるため、共有に追加する必要があります。コントローラーごとに異なる動作が必要な場合は、サブコントローラービューフォルダーごとにMyActionビューを配置する必要があります。

質問に答えるには、おそらくベースコントローラーフォルダーを検索することもできますが、ベースコントローラーフォルダーを検索する独自のリクエストハンドラーを作成する必要があります。デフォルトの実装では、ビューフォルダーで現在のコントローラーコンテキストのみが検索され、次に共有フォルダーが検索されます。ただし、ビューは共有されているように思われるので、共有フォルダはとにかくそれを行うのに適した場所のようです。

于 2010-10-21T12:46:20.210 に答える
0

可能ですが、あまりきれいではありません。

public class MyController : MyBaseController 
{
   public ActionResult MyAction(string id)
   {
       return View("~/Views/MyBaseController/MyAction.aspx");
   }
}

ただし、ビュー (MyAction.aspx) に部分ビューへの参照が含まれている場合、ASP.NET MVC は Views/MyController フォルダーでそれを検索します (そこでは見つかりません!)。

ビューがコントローラー間で共有されている場合は、Views/SharedNickLarsen が推奨するフォルダーに配置することをお勧めします。

于 2010-10-21T13:08:24.770 に答える