我的枚举看起来像:
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/
保留为默认网址
答案 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");
}