私は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>
ありがとう!
ありがとうございます!それは治療に効果があった。私は何を間違っていたのですか?もう一度、あなたの助言に感謝します。 –
@ Moo-Juice、あなたは私の答えで説明したようにいくつか間違っていました:1.あなたは明示的に 'filterContext.Result.ExecuteResult'を呼び出していました。2.ビューモデルを正しいオブジェクトに割り当てていなかった(' filterContext.Controller.ViewData.Model')をビューの結果に代入する代わりに使用します。 –