我昨天有这个工作,为什么它停止工作完全超出我的范围。我有以下基本情景:
我的应用程序中有两种类型的角色,租户和房东。当租户登录时,他们应该被引导到租户资料页面,同样适用于房东(目前我只与租户合作)。
以下是该方案的工作流程:
用户通过_LoginPartial
登录,我确定部分中的逻辑是正确的,但由于某种原因,SO不会让我在这里粘贴剃刀代码... < / p>
点击登录按钮会调出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);
}
调用后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
上的登录按钮时出现以下错误:
未找到视图“登录”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置: 〜/查看/帐号/的Login.aspx 〜/查看/帐号/ Login.ascx 〜/查看/共享/的Login.aspx 〜/查看/共享/ Login.ascx 〜/查看/帐号/ Login.cshtml 〜/查看/帐号/ Login.vbhtml 〜/查看/共享/ Login.cshtml 〜/查看/共享/ Login.vbhtml
为什么MVC正在寻找一个名为Login的视图?我没有指定它路由到名为Login的视图。我的路由/控制器逻辑有问题吗?非常感谢帮助。
答案 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
内部调用时使用 - 可能与用户不在会话中/完全登录等有关。
无论如何都有效。