2014-02-20 54 views
1

我有枚舉,看起來像:處理枚舉默認值作爲動作參數

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

輸入動作的參數有默認值,使URL www.mysite.com/part工作。所有其他路線按預期運作良好。

的問題是:我該如何處理像www.mysite.com/part/not_existent_enum_value網址 - 它應該返回HttpNotFound結果,並仍然保持www.mysite.com/part/網頁作爲默認一個

回答

3

謝謝關注,有我自己的答案:

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

0

在你的行動:

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

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

    return View("MyView"); 
} 
+0

AINT好。參數將永遠MyUrls.Url1如果我通過錯誤的值,以行動 – Sergio

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。您controlleraction可以如下:

public ActionResult MyPage(MyUrls url) 
+0

快到了,但我需要扔404,如果模型無效枚舉值。感謝您的關注,下面張貼我自己的答案 - 它看起來更簡單明瞭。 – Sergio

2

讓枚舉類型可空:

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