0

我昨天有这个工作,为什么它停止工作完全超出了我的范围。我有以下基本场景:

我的申请中有两种类型的角色,租户和房东。当租户登录时,他们应该被引导到租户个人资料页面,房东也是如此(目前我只与租户合作)。

这是场景的工作流程:

  1. 用户通过 登录_LoginPartial,我确定部分中的逻辑是正确的,但由于某种原因,所以不会让我将剃须刀代码正确粘贴到此处...

  2. 单击登录按钮将调用Login ActionResult. AccountController该方法验证用户并检查他们的角色。如果用户是租户角色,他们应该被重定向MyProfile ActionResultTenantsController. 代码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 的视图?我没有将它指定为路由到名为 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返回 a View(model)

按照约定,MVC 将在与控制器名称匹配的文件夹中查找与操作名称匹配的视图名称。因此它在 Accounts 控制器下寻找登录视图。

于 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

打开您的 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 回答
0

问题是由使用这个引起的......

if (Roles.IsUserInRole("Tenant"))

...而不是这个:

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

前者可以在用户登录后调用。似乎后者在内部调用时必须使用Login- 可能与用户不在会话中/完全登录等有关。

无论如何它都有效。

于 2013-02-28T17:31:42.053 回答