如何返回具有特定View的ActionResult(不是控制器名称)

cle*_*ent 23 c# asp.net-mvc asp.net-mvc-4

我在MVC Controller中有一个SendMail方法.这个方法调用其他方法ValidateLogin.这是验证登录的签名:

private ActionResult ValidateLogin(Models.ResetPassword model)
Run Code Online (Sandbox Code Playgroud)

当我从SendMail调用ValidateLogin时,出现此异常是因为控制器尝试搜索视图SendMail,但我想加载ResetPassword视图:

Global Error - The view 'SendMail' or its master was not found or no view engine supports the searched locations. The following locations were searched: ...
Run Code Online (Sandbox Code Playgroud)

这是SendMail的代码:

public ActionResult SendMail(string login)
{
        return ValidateLogin(login);
}
Run Code Online (Sandbox Code Playgroud)

如何覆盖return语句中的View?

提前致谢

小智 41

private ActionResult SendMail(string login)
{
            return View("~/Views/SpecificView.cshtml")
}
Run Code Online (Sandbox Code Playgroud)

您可以通过明确指向其位置直接指向特定视图.


Fel*_*ani 8

View方法有一个重载,它获取一个字符串viewName.有时你想传递一个string模型,asp.net框架会混淆它试图找到一个带有值的视图string.尝试这样的事情:

public ActionResult SendMail(string login)
{
   this.Model = login; // set the model
   return View("ValidateLogin"); // reponse the ValidateLogin view
}
Run Code Online (Sandbox Code Playgroud)


cle*_*ent 7

最后,这是解决方案

return View("ResetPassword", new ResetPassword
            {
                fields= fields
            });
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小小的补充:这将要求“ResetPassword.cshtml”应位于“~/Views/<controllerName>/”目录中。其中 <controllerName> 等于访问的控制器类的名称;例如:TestController >> "~/Views/Test/ResetPassword,cshtml" 将被访问以进行加载。不要在这里挣扎,否则将无法加载任何内容。;) (3认同)

Spe*_*van 5

如果 SendMail 是 POST,则应使用 POST-REDIRECT-GET 模式

    public ActionResult SendMail(string login)
    {
        ...        
        return RedirectToAction("ResetPassword", login);
    }

    public ActionResult ResetPassword(string login)
    {
        ...
        return View("ResetPassword", login);
    }
Run Code Online (Sandbox Code Playgroud)

这将保护您免受 IE 中重复发布的影响