【问题标题】:MVC 4 routing / controller logic - something basic going wrongMVC 4 路由/控制器逻辑 - 一些基本的问题
【发布时间】:2013-02-28 12:59:21
【问题描述】:

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

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

这是场景的工作流程:

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

  2. 点击登录按钮会调用AccountController中的LoginActionResult。该方法验证用户并检查他们的角色。如果用户是租户角色,他们应该被重定向到TenantsController中的MyProfileActionResultLogin的代码:

    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 时应显示用户的个人资料。 MyProfileActionResult的代码:

    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 的视图。我的路由/控制器逻辑有问题吗?非常感谢您的帮助。

【问题讨论】:

  • 你调试到这一行的代码了吗?..... return RedirectToAction("MyProfile", "Tenants");
  • 调试时不满足“如果”,由于某种原因,角色似乎不存在 - 它们是昨天的。
  • 是的,这就是为什么我在我的答案中提供了代码来测试它是否令人满意:) 谢谢

标签: c# asp.net-mvc view asp.net-mvc-routing asp.net-mvc-views


【解决方案1】:

因为这些行被执行了:

// 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);

【讨论】:

  • 登录凭证绝对有效。我现在明白为什么会出现这个错误,谢谢。鉴于我知道登录凭据是正确的,您能看到我在出错之前尝试做的事情有什么问题吗?
  • @MattSull87,角色会有什么变化吗?如果if 中的条件由于某种原因(例如登录用户不是租户)不满足,则重定向也不会发生。
  • 我想它也一定是这样 - 我已经调试过,当它到达“如果”时,我看不到我定义的角色......我会调查更多,谢谢。
【解决方案2】:

AccountsControllerLogin 操作返回 View(model)

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

【讨论】:

  • 谢谢,我明白为什么会出现这个错误。鉴于我知道登录凭据是正确的,您能看出我的逻辑还有什么问题吗?
  • 既然你有一个 _LoginPartial,你能返回那个带有模型错误的局部视图吗?登录凭据正确是一种运行时行为,您看到的错误将在编译时出现。此外,如果您的登录凭据错误,您仍然需要处理它。
【解决方案3】:

执行以下技巧并检查它是否在浏览器上打印“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");
}

【讨论】:

    【解决方案4】:

    打开您的 web.config。

    看这里:

    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
        <authentication mode="Forms">
          <forms loginUrl="~/Account/Login" timeout="2880" />
        </authentication>
    

    【讨论】:

    • 你能告诉我更多关于这将实现什么的信息吗?
    • 对不起,应该解释更多。查看您的 web.config 并确保它没有指向此位置的该视图。我曾经发生过这种情况,这就是问题所在。只需确认一件事就是指向正确的位置。或者我误解了这个问题。
    【解决方案5】:

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

    if (Roles.IsUserInRole("Tenant"))
    

    ...而不是这个:

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

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

    它仍然有效。

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多