0

私は「通常の」asp.netから来たので、MVCで少し(完全に)迷っています。

私が自分のasp.netプログラミングパターンでやっていたこと:

  • 「ページ」とそのプロパティ (mypage.loadJquery、mypage.isLogged、mypage.Title、カスタム キャッシュ ロジックなど) を表すカスタム クラス オブジェクトが 1 つあります。
  • このクラスは、各 ASHX ページの上で 1 回インスタンス化されます。次に、stringbuilder を操作して HTML を生成し、最後にブラウザーに出力します。
    • ASHX ページに 1 つのリクエストしかないため、最終的な response.write を呼び出すときに、最初から最後までインスタンス化されたページ オブジェクトを使用できます。

今、私はMVCに行こうとしています。M/V/C モデルとルーティングの概念を「ある程度」理解しました。カスタムの「ページ」オブジェクトを保持したいのですが、ページのライフ サイクルが失われ、すべての呼び出しの先頭でページ オブジェクトを 1 回インスタンス化する方法がまったくわかりません。

すべてのモデル、コントローラー、ビュー、部分ビュー、htmlhelper で、このインスタンス化された ONCE 共有オブジェクトが必要です...

現時点では、MVC パターンが混乱を招く可能性があることを認識していますが、どうすれば自分のニーズを再現できますか?

(非常に具体的な例:すべてのリクエストで、ユーザーがCookieを介してログに記録されているかどうかを確認する必要があります。そうであれば、データベースを往復してユーザー情報を取得します。次に、実質的にすべてのモデル/コントローラー/ビューでこれらの情報が必要ですもちろん、毎回セキュリティ チェックとデータベース クエリに丸めたくはありません。mvc サイクル全体でこれらの情報を取得するにはどうすればよいですか?)

4

2 に答える 2

0

私のプロジェクトIViewModelでは、レイアウト/マスターページに必要なすべてのフィールドを含むインターフェイスを作成し、そのモデルとして設定して、簡単に使用できるようにします。

IViewModel.cs

public interface IViewModel
{
    string Title { get; set; }

    User User { get; set; }
}

Layout.cshtml

@model IViewModel

<html>
    <head>
        <title>@Model.Title</title>
    </head>
    <body>
        @if (Model.User.IsAuthenticated) {
             You are logged as @Model.User.Name
        }
    </body>
</html>

私のすべてのモデルはそのインターフェースを実装します(またはそのクラスのデフォルト実装である ViewModelBase から継承します)。さらに、返された ActionResult が (Partial)ViewResult であるかどうか、およびその Model がIViewModelインターフェイスを実装してそのインターフェイスにデータを入力するかどうかをチェックするカスタム アクション フィルターがあります。

public FillViewModelAttribute : ActionFilterAttribute
{
    public override OnActionExecuted(ActionExecutedContext context)
    {
        var viewResult = context.Result as ViewResult;
        if (viewResult != null && viewResult.Model is IViewModel)
        {
            var viewModel = (IViewModel)viewResult.Model;
            // fill data
        }
    }
}
于 2013-03-11T18:52:20.237 に答える
0

私はこのような多くのプロジェクトを作成しました。基本的に、他のすべてのコントローラーが継承する基本コントローラー クラスを作成できます。

[Authorize]
public class BaseController : Controller
{

    private Instructor _G_USER = null;

    protected Instructor G_USER 
    {
        get
        {
            if (_G_USER == null)
            {
                _G_USER = Your DB query here
                ViewData["G_USER"] = _G_USER;

            }
            return _G_USER;
        }
    }
}

次に、すべての子クラスで、次のことができます

[Authorize]
public class YourController : BaseController
{
    public ActionResult Index()
    {
        if(!G_USER.CAN_DO_THIS)  throw new NoPermissionException();

        return View();
    }
}

ビューでユーザーを使用するには、拡張メソッドを作成します。

public static class ExtentionMethods
{
    public static USER G_USER(this ViewPage page)
    {            
        return (USER)page.ViewData["G_USER"];
    }
}

次に、このようなページで使用します

<%=this.G_USER().....%>
于 2013-03-11T18:49:57.403 に答える