MVC 4路由/控制器逻辑 - 一些基本出错的地方

时间:2013-02-28 12:59:21

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

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

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

以下是该方案的工作流程:

  1. 用户通过_LoginPartial登录,我确定部分中的逻辑是正确的,但由于某种原因,SO不会让我在这里粘贴剃刀代码... < / p>

  2. 点击登录按钮会调出Login中的ActionResult AccountController。该方法验证用户并检查他们所处的角色。如果用户处于角色租户,则​​应将其重定向到MyProfile中的ActionResult TenantsControllerLogin的代码:

    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);
    }
    
  4. 正如我所说,这在昨天工作,但当我点击_RegisterPartial上的登录按钮时出现以下错误:

      

    未找到视图“登录”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置:   〜/查看/帐号/的Login.aspx   〜/查看/帐号/ Login.ascx   〜/查看/共享/的Login.aspx   〜/查看/共享/ Login.ascx   〜/查看/帐号/ Login.cshtml   〜/查看/帐号/ Login.vbhtml   〜/查看/共享/ Login.cshtml   〜/查看/共享/ Login.vbhtml

    为什么MVC正在寻找一个名为Login的视图?我没有指定它路由到名为Login的视图。我的路由/控制器逻辑有问题吗?非常感谢帮助。

5 个答案:

答案 0 :(得分:2)

因为执行了这些行:

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

显然登录尝试失败或输入无效。现在执行Login操作的最后一次返回。由于您尚未直接声明视图的名称,因此命名约定会尝试查找与操作同名的视图(在本例中为Login)。尝试明确指定视图名称:

return View("ViewName", model);

答案 1 :(得分:0)

Login AccountsController行动会返回View(model)

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

答案 2 :(得分: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");
}

答案 3 :(得分: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>

答案 4 :(得分:0)

使用此问题导致问题......

if (Roles.IsUserInRole("Tenant"))

......而不是:

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

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

无论如何都有效。