2011-07-17 3 views
5

私はSOに関するいくつかの質問を調査しましたが、これに対する回答を見つけることができませんでした。誰が知っているのか、おそらく私はベストプラクティスを打ち破っています属性を指定するだけでレイアウトを設定できるレイアウトインジェクタアトリビュートの優れた答えを読んだあと、この種のクラスを使用して、ユーザを認証するコントローラをアトリビュートにすることもできると考えました。ビューを処理するときにモデルがnullであるという事実は別に、OnActionExecutingから明示的に設定するとViewModelがnullになる

// class AdminAttribute 
public class AdminAttribute : LayoutInjectorAttribute 
{ 
    // ctor 
    public AdminAttribute() 
     : base("_LayoutAdmin") 
    { 
    } // eo ctor 


    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     WebUser user = WebApplication.CurrentUser; 
     if (!user.IsAuthenticated) 
     { 
      filterContext.Result = new ViewResult() { ViewName = "Unauthorised" }; 
      filterContext.Controller.ViewData.Model = new ViewModel(WebApplication.CurrentUser.Translate("msgunauthorisedtitle")); 
      filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext); 
      return; 
     } 
     base.OnActionExecuting(filterContext); 
    } // eo OnActionExecuting 

} // eo class AdminAttribute 

すべての作品:

だから、私はどこにでも認証をチェックすることではなく、私は次のように書きました。なぜ誰が考えているのでしょうか?

ビューページ(Unauthorised.cshtml)事前に

@model Py2.Web.ViewModel 
<h2>@Model.Title</h2> 

ありがとう!

答えて

3

は次のように試してみてください:明示的ExecuteResultを呼び出す必要がないこと

if (!user.IsAuthenticated) 
{ 
    var result = new ViewResult { ViewName = "Unauthorised" }; 
    var model = new ViewModel(
     WebApplication.CurrentUser.Translate("msgunauthorisedtitle") 
    ); 
    result.ViewData.Model = model; 
    filterContext.Result = result; 
    return; 
} 

は注意してください、それは単にそれをモデル(result.ViewData.Model = model)を渡すことによってするViewResultを返し、ASP.NET MVCのframeowrkの仕事です。また、このビューモデルがビュー結果に渡される方法に注意し、コード内で行っていたとおりにfilterContext.Controller.ViewData.Modelには通知しません。

+0

ありがとうございます!それは治療に効果があった。私は何を間違っていたのですか?もう一度、あなたの助言に感謝します。 –

+1

@ Moo-Juice、あなたは私の答えで説明したようにいくつか間違っていました:1.あなたは明示的に 'filterContext.Result.ExecuteResult'を呼び出していました。2.ビューモデルを正しいオブジェクトに割り当てていなかった(' filterContext.Controller.ViewData.Model')をビューの結果に代入する代わりに使用します。 –

関連する問題