5

万が一、特定のコントローラー内のすべてのアクションにデフォルトのMasterViewを設定する簡単な方法はありますか?

たとえば、HomeControllerがある場合は、その中のすべてのアクションでSite.Masterをデフォルトとして継承しますが、 AccountsController内でいる場合は、すべてのアクションでAdmin.Masterなどを継承します。

私はなんとかそれをすることができました:

return View("viewName", "masterName", objectModel);

ただし、これを行うことにより、Viewメソッドを呼び出すたびに適用する必要があります。

私は、私たちが宣言できるレールのようなもっと単純なものを探していました:

class HomeController < ApplicationController

  layout 'site'

   def index
   end

   def create
   ...

end

class AccountsController < ApplicationController

  layout 'admin'

  def index
  end

  def create
  ...  

end

それは可能ですか?

前もって感謝します

4

1 に答える 1

6

そのControllerクラスでOnActionExecutingをオーバーライドできます。

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ViewData["MasterfileToUser"] = "site";
}       

または、必要に応じて、これをActionFilterAttributeに変換して、コントローラーまたはアクションレベルに適用できます。

using System;
using System.Web.Mvc;
public class MasterFileFilterAttribute : ActionFilterAttribute
{
    public string Master { get; set; }

    public override void OnActionExecuted( ActionExecutedContext filterContext)   
    {        
            if (filterContext.Result is ViewResult)
                    ((ViewResult)filterContext.Result).MasterName = Master;
    }
}

次に、次のように使用します。

[MasterFileFilterAttribute(Master = "site")] 
public class HomeController : Controller 
{ 
    // Action methods 
}   
于 2009-09-13T19:05:20.157 に答える