0

したがって、別のデータベースでasp.netメンバーシップを使用するmvc .netアプリケーションには、管理者、会社、および従業員の3つの役割があります。モデルを変更するたびに .net メンバーシップ テーブルが削除されるため、.net メンバーシップを別のデータベースに移動しました。

とにかく、アクション メソッドで if/else を使用してさまざまな役割を処理しています。たとえば、Index() アクションでは、ユーザーが管理者ロールにあるかどうかを確認し、それに基づいてモデルと linq クエリを作成します。ユーザーが会社ロールの場合は別のクエリで、ユーザーが従業員ロールの場合は別のクエリです。以下のコードを確認してください。if 条件が View に渡された後に作成されるモデル。

これは役割を処理する最良の方法ではないように感じます。これは役割を処理するための最良の方法ですか? 私も別の分野を検討していますが、私は異なる役割に対して同じビューを使用しているため、生産的ではない可能性があると思います。

どんな提案/アイデアも大歓迎です。

[Authorize]
    public class CompanyController : Controller
    {
        private MyDBContext db = new MyDBContext();

        //
        // GET: /Company/

        public ViewResult Index()
        {
            var viewModel = new CompanyIndexViewModel();
            if (Roles.IsUserInRole("administrators")) {
                viewModel = new CompanyIndexViewModel { Companies = db.Companies.ToList() };
            }
            else if (Roles.IsUserInRole("companies")) {
                viewModel = new CompanyIndexViewModel { Companies = db.Companies.Where(c => c.Username.ToLower().Equals(this.User.Identity.Name.ToLower())).ToList() };
            }
            else if (Roles.IsUserInRole("employees")) {
                string userName = this.User.Identity.Name.ToLower();
                var companies = db.Companies.Where(c => c.Appointments.Any(a =>
                                   a.Employee.Username.ToLower() == userName)).ToList();
                viewModel = new CompanyIndexViewModel { Companies = companies.ToList() };
            }

            return View(viewModel);
        }
....
4

2 に答える 2

2

私がすることは2つあります:

まず、StanK が言ったことをコントローラー アクションの外に移動します。ただし、コントローラーからまとめて移動します。この種のロジックは、最初からコントローラーに存在するべきではありません (アクション内にあるか、コントローラー内のプライベート メソッドにあるかに関係なく)。

次のように考えてみてください。誰がどの会社を見ることができるかについてのロジックが変更された場合はどうなるでしょうか..あらゆる種類の異なる場所でそれを変更する必要があります.

次に、そのようにインラインで初期化するのではなく、Company のリストを取得する CompanyIndexViewModel のコンストラクターを作成します。CompanyIndexViewModel には、会社以外に何かが含まれていますか?

// your controller
public ViewResult Index()
{
    var viewModel = CompanyIndexViewModel(CompanyService.GetCompaniesForCurrentUser());
    return View(viewModel);
}

理想的には、コントローラーを「CompanyService」を表すインターフェースに依存させ、それをコントローラーに注入することもできます。

MVC 3 で Ninject を使用する方法について概説しているこのブログをご覧ください。後で非常に強力なものをセットアップするのは非常に簡単です。

上で述べたことから 1 つ取り除けば、コントローラーからロジックを移動することから始めるのがおそらく最善です。

于 2012-07-17T04:03:10.060 に答える
1

会社のリストを構築するコードを独自のメソッドに移動して、コントローラーのアクションを整理します。これにより、現在のユーザーの会社のリストを決定するロジックも再利用可能になります。

例えば

private List<Company> GetCompaniesForCurrentUser()
{
    var userName = this.User.Identity.Name.ToLower();

    if (Roles.IsUserInRole("administrators"))
        return db.Companies.ToList();

    if (Roles.IsUserInRole("companies"))
        return db.Companies.Where(c => c.Username.ToLower().Equals(userName)).ToList();

    if (Roles.IsUserInRole("employees"))
        return db.Companies.Where(c => c.Appointments.Any(a =>
        a.Employee.Username.ToLower() == userName)).ToList();

    throw new AuthorizationException("User " + userName + " is not authorised.");

}


public ViewResult Index()
{
    var viewModel = new CompanyIndexViewModel { Companies = GetCompaniesForCurrentUser() };
    return View(viewModel);
}
于 2012-07-17T01:17:21.713 に答える