【问题标题】:Handling enum default value as action parameter将枚举默认值作为操作参数处理
【发布时间】:2014-02-20 13:12:52
【问题描述】:

我的枚举看起来像:

public enum MyUrls
{
    Url1 = 0,       
    Url2 = 1,       
    Url3 = 2
}

我正在使用它为我网站上的某些页面生成 url。 基本 url 看起来像 www.mysite.com/part/,我也有 3 条路线:

www.mysite.com/part/Url1
www.mysite.com/part/Url2
www.mysite.com/part/Url3

查询字符串的最后一个参数是使用 UrlHelper 生成的。

控制器动作如下:

public ActionResult MyPage(MyUrls parameter = MyUrls.Url1)
{       
    return View("MyView");
}

action 的输入参数具有默认值以使 url www.mysite.com/part 工作。所有其他路线都按预期运行。

问题是:我如何处理像 www.mysite.com/part/not_existent_enum_value 这样的网址 - 它应该返回 HttpNotFound 结果,并且仍然保留页面 www.mysite.com/part/ 作为默认页面

【问题讨论】:

    标签: c# asp.net-mvc url-routing


    【解决方案1】:

    感谢关注,得到了我自己的答案:

    public ActionResult MyPage(string parameter)
    {
        var parameterValue = MyUrls.Url1;
        if (!string.IsNullOrEmpty(parameter) && !Enum.TryParse(parameter, out parameterValue))
            return HttpNotFound();
        return View("MyView");
    }
    

    parameterValue 将包含路由的默认值。如果 parameter 传递给操作是无效的枚举值,我们会抛出错误 404

    【讨论】:

      【解决方案2】:

      使枚举类型可以为空:

      public ActionResult MyPage(MyUrls? parameter = MyUrls.Url1)
      {
          if (!parameter.HasValue) {
             return HttpNotFound();
          }
          return View("MyView");
      }
      

      【讨论】:

        【解决方案3】:

        您可以尝试使用IModelBinder

        public class MyUrlsEnumModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        
                MyUrls temp;
        
                if (!Enum.TryParse(valueResult.AttemptedValue, out temp))
                    return MyUrls.Url1;
                return temp;
            }
        }
        

        在您的 Global.asax.cs 中:

            protected void Application_Start()
            {
                /*  */
                ModelBinders.Binders.Add(typeof(MyUrls), new MyUrlsEnumModelBinder());
            }
        

        如果值无效,这将始终将值设置为MyUrls.Url1。你的controlleraction可以如下:

          public ActionResult MyPage(MyUrls url)
        

        【讨论】:

        • 差不多了,但是如果模型是无效的枚举值,我需要抛出 404。感谢您的关注,在下面发布了我自己的答案 - 它看起来更简单明了。
        【解决方案4】:

        在你的行动中:

        public ActionResult MyPage(MyUrls parameter = MyUrls.Url1)
        {       
        
           if( Enum.IsDefined(typeof(MyUrls), parameter ) )
           {
              //redirect your not found url
           }
        
            return View("MyView");
        }
        

        【讨论】:

        • 不好。如果我将错误的值传递给操作,参数将始终是 MyUrls.Url1
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 2013-10-07
        相关资源
        最近更新 更多