找不到视图"索引"或其主节点。搜索了以下位置



我在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"。