我在MVC应用程序中收到这个错误:
未找到视图"Index"或其主视图。搜索了以下位置:
~/Views/User/Index.aspx
~/Views/User/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
我不明白它为什么会出现;我并没有试图导航到"索引"视图;我正在尝试导航到ChangeExpiredPassword路由。ChangeExpiredPassword控制器操作的代码正在执行,但一旦控制从该方法传出,就会从MVC内部抛出此错误。我不知道为什么我们要突然重定向到Index。我不知道哪些代码与共享相关,但我可以根据请求添加代码。谢谢
编辑:这是我们如何获得ChangeExpiredPassword的,这是来自UserController
类:
[HttpPost]
public ActionResult Index(LogOnModel model, string returnUrl)
{
...
if (pwExpirationDate < DateTime.Now)
{
return ChangeExpiredPassword();
}
...
}
这里是ChangeExpiredPassword本身,减去一些HTML构建代码:
[HttpGet]
public ActionResult ChangeExpiredPassword()
{
ActionResult actionResult = null;
try
{
ContentViewModel viewModel = new ContentViewModel();
Form form = new Form();
form.Method = FormMethod.Post;
form.Action = "User/ChangeExpiredPassword";
// this is where we build some HTML for the Change Expired Password view
viewModel.ContentControls.Add(form);
actionResult = View(viewModel);
}
catch (Exception ex)
{
HandleException(ex);
actionResult = Error();
}
return actionResult;
}
如果ChangeExpiredPassword
本身就是一个操作,并且如果该操作以以下方式结束:
return View();
然后返回ChangeExpiredPassword()
尝试返回视图但是,框架选择的视图是基于所请求的路由,而不是基于所调用的方法。从框架的角度来看,您正在从Index
中返回View()
。
听起来您想将用户重定向到ChangeExpiredPassword
。在你的Index
操作中,哪个看起来更像这样:
return RedirectToAction(nameof(ChangeExpiredPassword));
这将指示浏览器为ChangeExpiredPassword
动作发起新的GET
请求。从语义上讲,这就是你想要发生的事情。没有必要试图巧妙地返回高度自定义的响应。保持每个请求/响应简单且RESTful。Index
的响应指示客户端"您需要转到ChangeExpiredPassword
"。