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
应显示用户的配置文件。MyProfile
ActionResult
的代码:
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,你能返回包含模型错误的部分视图吗?登录凭据正确是一种运行时行为,您看到的错误将在编译时出现。此外,如果您的登录凭据错误,您仍然需要处理它。