C# MVC4路由/控制器逻辑-一些基本问题

C# MVC4路由/控制器逻辑-一些基本问题,c#,asp.net-mvc,view,asp.net-mvc-routing,asp.net-mvc-views,C#,Asp.net Mvc,View,Asp.net Mvc Routing,Asp.net Mvc Views,我昨天就开始工作了,我完全不明白为什么它停止工作了。我有以下基本情况: 在我的应用程序中有两种类型的角色,租户和房东。当租户登录时,他们应该被引导到租户配置文件页面,房东也是如此(目前我只与租户合作) 以下是该场景的工作流程: 用户通过\u LoginPartial登录,我确信部分中的逻辑是正确的,但由于某些原因,因此不允许我将razor代码正确粘贴到这里 单击登录按钮调用AccountController中的LoginActionResult。该方法验证用户并检查他们所扮演的角色。如果用户担任

我昨天就开始工作了,我完全不明白为什么它停止工作了。我有以下基本情况:

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

以下是该场景的工作流程:

  • 用户通过
    \u LoginPartial
    登录,我确信部分中的逻辑是正确的,但由于某些原因,因此不允许我将razor代码正确粘贴到这里

  • 单击登录按钮调用
    AccountController
    中的
    Login
    ActionResult
    。该方法验证用户并检查他们所扮演的角色。如果用户担任租户角色,则应将其重定向到
    租户控制器
    中的
    MyProfile
    操作结果
    。登录的代码:

    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);
    }
    
  • 调用时,
    MyProfile
    应显示用户的配置文件。MyProfileActionResult的代码:

    public ActionResult MyProfile()
    {
        var db = new LetLordContext();
        var currentTenant = db.UserProfile.First(t => t.UserName == HttpContext.User.Identity.Name);
    
        return View(currentTenant);
    }
    
  • 正如我昨天所说的,这是有效的,但是当我单击
    \u 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的视图。我的路由/控制器逻辑是否有问题?非常感谢您的帮助。

    您的
    登录
    AccountsController的操作返回一个
    视图(模型)


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

    因为这些行是执行的:

    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
    
    显然,登录尝试失败或输入无效。现在执行
    登录
    操作的最后一次返回。由于您没有直接声明视图的名称,命名约定将尝试查找与操作同名的视图(在本例中为登录名)。尝试显式指定视图名称:

    return View("ViewName", model);
    

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

    看这里:

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

    使用此

    if (Roles.IsUserInRole("Tenant"))
    
    …而不是这个:

    if (Roles.IsUserInRole(model.UserName, "Tenant"))
    
    用户登录后可以调用前者。在
    Login
    内部调用时,似乎必须使用后者-可能与用户未在会话中/完全登录等有关


    不管怎样,它都能工作。

    你调试代码到这一行了吗?。。。。。返回重定向操作(“MyProfile”、“租户”);“如果”在我调试时不满意,因为某种原因,角色似乎不在那里-它们是昨天出现的。是的,这就是为什么我在回答中向您提供代码来测试它是否令人满意:)谢谢登录凭据绝对有效。我现在明白我为什么会犯这个错误了,谢谢。如果我知道登录凭据是正确的,那么在出现错误之前,你能看到我尝试做的有什么错误吗?@MattSull87,角色可能会有任何变化吗?如果
    中的条件由于某种原因(例如,登录用户不是租户)不满足,则重定向也不会发生。我想一定也是这样-我已经调试过了,当到达“如果”时,我看不到我定义的角色。。。我会进一步调查的,谢谢。你能给我更多的信息,这到底能达到什么目的吗?对不起,我应该解释得更多。查看web.config,确保它没有指向该位置的视图。我曾经遇到过这种情况,这就是问题所在。只有一件事需要确认,那就是指向正确的位置。或者我误解了这个问题。谢谢,我理解为什么我会犯这个错误。如果我知道登录凭据是正确的,那么你能看到我的逻辑还有什么错误吗?既然你有一个_LoginPartial,你能返回包含模型错误的部分视图吗?登录凭据正确是一种运行时行为,您看到的错误将在编译时出现。此外,如果您的登录凭据错误,您仍然需要处理它。