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

时间:2014-10-14 11:00:38

标签: c# asp.net-mvc asp.net-mvc-4

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

private ActionResult ValidateLogin(Models.ResetPassword model)

当我从SendMail调用ValidateLogin时,会出现此异常,因为控制器尝试搜索ViewMail视图,但我想加载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: ...

这是SendMail的代码:

public ActionResult SendMail(string login)
{
        return ValidateLogin(login);
}

如何覆盖return语句中的View?

提前致谢

5 个答案:

答案 0 :(得分:39)

private ActionResult SendMail(string login)
{
            return View("~/Views/SpecificView.cshtml")
}

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

答案 1 :(得分: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
}

答案 2 :(得分:7)

最后,这是解决方案

return View("ResetPassword", new ResetPassword
            {
                fields= fields
            });

答案 3 :(得分:0)

您可以按照这样的名称返回视图

return View("viewnamehere");

答案 4 :(得分:0)

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

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

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

这将保护您免受IE中的双重攻击