演示如何不写controller 方法,而直接返回View。这里通过使用HandleUnknownAction 方法来自动处理对一个controller 的每个没有对应方法的请求。
Controller 类包含一个HandleUnknownAction()方法,它在你试图去调用一个不存在的action 时被执行。如果每个Action只是包含“return View()”,那么可以利用该方法简化代码量,用它来呈现View。(当然如果不加以限制配合文件遍历漏洞会是个安全问题,个人不建议简单基于不写Action的目的而采用)
建议还是跳转一个指定的地址承接不明方法或者呈现一个错误视图比较妥当(如下图)
以下是不写controller 方法,而直接返回View的代码(个人不太建议的方案)
namespace Test.Controllers
{
public abstract class BaseController : Controller
{
#region 如果Action没有定义,则直接查找View文件
protected override void HandleUnknownAction(string actionName)
{
if (Request.HttpMethod == "POST")
throw new Exception("没有Action:" + actionName);
// 搜索文件是否存在
var filePath = "";
string url = "";
if (RouteData.DataTokens["area"] != null)
{
filePath = string.Format("~/Areas/{0}/Views/{1}/{2}.cshtml", RouteData.DataTokens["area"], RouteData.Values["controller"], actionName);
url = string.Format("/{0}/{1}/{2}", RouteData.DataTokens["area"], RouteData.Values["controller"], actionName);
}
else
{
filePath = string.Format("~/Views/{0}/{1}.cshtml", RouteData.Values["controller"], actionName);
url = string.Format("/{0}/{1}", RouteData.Values["controller"], actionName);
}
#region 权限处理 【如果用户没有Url权限,则跳转到错误页】
//List<Menu_Url> forbidList = GetForbidMenus();
//if (forbidList.Count(p => !string.IsNullOrWhiteSpace(p.Url) && url.StartsWith(p.Url)) > 0)
//{
// filePath = string.Format("~/Views/Shared/Error.cshtml");
//}
#endregion
if (System.IO.File.Exists(Server.MapPath(filePath)))
{
View(filePath).ExecuteResult(ControllerContext);
}
else
{
base.HandleUnknownAction(actionName);
}
}
#endregion
......
}
}
题外篇:如何模拟框架Moq对ASP.NET MVC控制器的HandleUnknownAction()进行单元测试: