1

私はすべてのコントローラーにこの反復コードを持っています:

        var user = Session["_User"] as User;

        if (user== null)
        {
            return RedirectToAction("Index");
        }

これをリファクタリングするにはどうすればよいですか?これを属性に追加するか、セッションラッパーを作成する必要がありますか?

最善のアプローチは何でしょうか?

4

2 に答える 2

2

すべてのコントローラーをMasterControllerで拡張し、OnActionExecutingメソッドを次のようにオーバーライドします

public class MasterController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var user = Session["_User"] as User;

        if (user== null)
        {
            if(filterContext.ActionDescriptor.ActionName != "Index" || filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != "ControllerThatContainIndexAction")
            {
                 filterContext.Result = this.RedirectToAction("Index");
                 return;
            }
        }
        base.OnActionExecuting(filterContext);
    }
}
于 2012-04-28T18:50:58.923 に答える
2

説明

多くの方法があります。独自のコントローラーを作成します。これから他のコントローラーを継承するより。

サンプル

public class BaseController : Controller
{
    public User User { get; private set; }

    public BaseController()
    {
        this.User = Session["_User"] as User;
    }
}

public class HomeController: BaseController 
{
    // your action methods
}
于 2012-04-28T18:49:58.527 に答える