MVC路由参数是可选的,而ActionResult是必需的参数

时间:2018-08-10 18:26:44

标签: asp.net-mvc asp.net-mvc-5

我有一个具有多个操作的控制器(产品),一些具有必需的参数(编辑,详细信息,历史记录),有些具有可为空的参数(创建,搜索)。具有可选参数的默认路由将路由到所有操作,但是如果用户输入的URL指向具有必需参数(即产品/历史记录)的控制器/操作,则会引发错误。处理此问题的最佳地点是什么?我应该:

  1. 将具有必需的with参数的动作的路由定义为具有必需的URL参数?

     routes.MapRoute(  
               name: "ProductParamRequired",  
               url: "Product/History/{id}",  
               defaults: new { controller = "Product", action = "History"}  
           );  
    
  2. 将操作更改为具有可选参数,并返回错误的请求。

    public ActionResult History(int? id)
        {
            if (id == null)
            {
                throw new HttpException(400, "BadRequest");
            }
    
  3. 让应用程序抛出500个内部服务器错误,并向用户显示(当然是自定义错误页面)?

谢谢你,星期五快乐!

1 个答案:

答案 0 :(得分:1)

如果需要,请绝对将其作为路由的一部分。如果某个请求甚至没有您期望的数据,请不要接受处理它的想法。与在应用程序边缘进行验证相比,修复已放入应用程序中的不良数据的成本要高得多。始终尽早验证输入。

2不是一个好主意,因为您最终将为每个操作和每个所需的参数复制此模式。

3不是一个好主意,因为您甚至没有尝试验证数据。那总是自找麻烦。

1很好,因为它大概会退回到您的默认路由product/history

顺便说一句,在明确定义路线时,使用attribute routing可以避免维护大量的RouteConfig