7

ユーザーが私のアプリケーションにログインするとき、アプリケーション全体で彼の名前を表示したいと思います。asp.netMVCフレームワークを使用しています。しかし、私が望まないのは、すべてのコントローラーに次のようなものを入れなければならないということです。

ViewData["User"] = Session["User"];

これはあなたが自分自身を繰り返さないかもしれないからです。(これは、オブジェクト指向プログラミングのDRY [Do n't Repeat Yourself]の原則だと思います。)ViewData["User"]は私のマスターページにあります。だから私の質問は、私のViewData["User"]を1か所で処理するためのきちんとした方法は何ですか?

4

4 に答える 4

13

これは、コントローラーの基本クラス、またはコントローラー/アクションに適用されるアクションフィルターのいずれかでかなり簡単に行うことができます。いずれの場合も、アクションの前(または後)にリクエストに触れる機会があります。そのため、この機能をそこに追加できます。

例えば:

public class UserInfoAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
        filterContext.Controller.ViewData["user"] = "Foo";
    }
}
...
[HandleError, UserInfo]
public class HomeController : Controller
{...}

(アクション(メソッド)レベルでも使用できます)


または共通の基本クラスを使用する場合:

public abstract class ControllerBase : Controller
{
    protected override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        ViewData["user"] = "Bar";
        base.OnActionExecuting(filterContext);
    }
}

[HandleError]
public class HomeController : ControllerBase
{...}
于 2009-04-17T08:29:28.893 に答える
5

1年経ちましたが、この質問に出くわしたばかりで、もっと良い答えがあると思います.

Jimmy Bogard は、受け入れられた回答で説明されているソリューションをアンチパターンとして説明し、以下を含むより良いソリューションを提供していRenderActionます。アンチパターン.aspx

于 2010-05-04T09:07:18.427 に答える
2

アプリケーション全体で永続モデルデータを提供する別の方法は、DefaultFactoryControllerをカスタムのものでオーバーライドすることです。CustomerFactoryControllerで、永続化するモデルでViewBagをハイドレイトします。

于 2011-12-16T21:42:48.423 に答える
2

UserName プロパティを使用して、モデルの基本クラスを作成します。

public abstract class ModelBase
{
    public string UserName { get; set; }
}

コントローラーの基本クラスを作成し、その OnActionExecuted メソッドをオーバーライドします。その中で、モデルが BaseModel から派生しているかどうかを確認し、派生している場合は UserName プロパティを設定します。

public class ControllerBase : Controller
{
    protected override void OnActionExecuted(
        ActionExecutedContext filterContext)
    {
        var modelBase = ViewData.Model as ModelBase;

        if (modelBase != null)
        {
            modelBase.UserName = "foo";
        }

        base.OnActionExecuted(filterContext);
    }
}

次に、次のようにビューにユーザーの UserName を表示できます。

<%= Html.Encode(Model.UserName) %>

も参照してください

于 2009-04-17T08:40:41.880 に答える