将枚举默认值作为操作参数处理

时间:2014-02-20 13:12:52

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

我的枚举看起来像:

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

我正在使用它来为我网站上的某些页面生成网址。 基本网址看起来像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");
}

操作的输入参数具有使网址www.mysite.com/part有效的默认值。所有其他路线都按预期运作良好。

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

4 个答案:

答案 0 :(得分:4)

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

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传递给action是无效的枚举值,我们会抛出错误404

答案 1 :(得分:3)

使枚举类型可以为空:

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

答案 2 :(得分:2)

您可以尝试使用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。您可以按照以下方式进行控制:

  public ActionResult MyPage(MyUrls url)

答案 3 :(得分:0)

在你的行动中:

public ActionResult MyPage(MyUrls parameter = MyUrls.Url1)
{       

   if( Enum.IsDefined(typeof(MyUrls), parameter ) )
   {
      //redirect your not found url
   }

    return View("MyView");
}