0

私は昨日これを機能させました、そしてそれが機能しなくなった理由は完全に私を超えています。次の基本的なシナリオがあります。

私のアプリケーションには、テナントと家主の2種類の役割があります。テナントがログインすると、テナントのプロフィールページに移動する必要があります。同じことが家主にも当てはまります(現時点では、テナントのみを扱っています)。

シナリオのワークフローは次のとおりです。

  1. ユーザーは経由でログインし_LoginPartialます。パーシャルのロジックは正しいと思いますが、何らかの理由で、ここにかみそりのコードを適切に貼り付けることができません...

  2. ログインボタンをクリックすると、のが呼び出されLogin ActionResultますAccountController。このメソッドは、ユーザーを検証し、ユーザーがどのロールに属しているかを確認します。ユーザーがロールテナントに属している場合は、のにリダイレクトする必要がMyProfile ActionResultありTenantsControllerます。のコードLogin

    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            if (Roles.IsUserInRole("Tenant"))
            {
                return RedirectToAction("MyProfile", "Tenants");
            }
        }
    
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }
    
  3. 呼び出されるMyProfileと、ユーザーのプロファイルが表示されます。のコードMyProfile ActionResult

    public ActionResult MyProfile()
    {
        var db = new LetLordContext();
        var currentTenant = db.UserProfile.First(t => t.UserName == HttpContext.User.Identity.Name);
    
        return View(currentTenant);
    }
    

私が昨日これは機能していたと言ったが、ログインボタンをクリックすると次のエラーが発生する_RegisterPartial

ビュー「ログイン」またはそのマスターが見つからなかったか、検索された場所をサポートするビューエンジンがありません。次の場所が検索されました:〜/ Views / Account / Login.aspx〜/ Views / Account / Login.ascx〜/ Views / Shared / Login.aspx〜/ Views / Shared / Login.ascx〜/ Views / Account/Login。 cshtml〜/ Views / Account / Login.vbhtml〜/ Views / Shared / Login.cshtml〜/ Views / Shared / Login.vbhtml

MVCがログインと呼ばれるビューを探しているのはなぜですか?Loginというビューにルーティングするように指定していません。ルーティング/コントローラーロジックに何か問題がありますか?助けていただければ幸いです。

4

5 に答える 5

2

これらの行が実行されるため:

// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);

どうやらログインに失敗したか、入力が無効でした。これで、アクションの最後のリターンLoginが実行されます。ビューの名前を直接指定していないため、命名規則はアクション (この場合はログイン) と同じ名前のビューを見つけようとします。ビュー名を明示的に指定してみてください:

return View("ViewName", model);
于 2013-02-28T13:05:01.357 に答える
0

あなたのLoginアクションは をAccountsController返しますView(model)

慣例により、MVC はコントローラー名に一致するフォルダー内でアクション名に一致するビュー名を探します。したがって、アカウント コントローラーでログイン ビューを探しています。

于 2013-02-28T13:04:41.997 に答える
0

次のトリックを実行して、ブラウザに「Hello User」が表示されるかどうかを確認します。表示されている場合は、メソッドの下部に記載されているように、ユーザーが検証されておらず、ログイン ページにリダイレクトされていないことを意味します。

public ActionResult Login(LoginModel model)
{
    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
    {
        if (Roles.IsUserInRole("Tenant"))
        {
            return RedirectToAction("MyProfile", "Tenants");
        }
    }

    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return Content("Hello User");
}
于 2013-02-28T13:07:05.070 に答える
0

この問題は、これを使用することによって引き起こされていました...

if (Roles.IsUserInRole("Tenant"))

...これの代わりに:

if (Roles.IsUserInRole(model.UserName, "Tenant"))

前者は、ユーザーがログインした後に呼び出すことができます。後者は、内部で呼び出されたときに使用するLogin必要があるようです-ユーザーがセッションに参加していない/完全にログインしていることなどに関係している可能性があります.

とにかく動作します。

于 2013-02-28T17:31:42.053 に答える
0

web.config を開きます。

ここを見て:

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
于 2013-02-28T13:13:05.757 に答える