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

问题描述 投票:2回答:4

我的枚举看起来像:

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");
}

输入参数的动作有默认值,使url www.mysite.com/part工作。所有其他路线都按预期运作良好。

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

c# asp.net-mvc url-routing
4个回答
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


3
投票

使枚举类型可以为空:

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

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)

0
投票

在你的行动中:

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

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

    return View("MyView");
}
© www.soinside.com 2019 - 2024. All rights reserved.