2011-10-17 56 views
2

我有這樣的路線:如何自定義編碼/解碼路由值?

{controller}/{id}/{action} 

因爲我覺得它使來自REST風格的角度來看更有意義。

問題是id可能包含斜槓(/),並且即使編碼爲「%2F」,那些也被視爲路由分隔符。甚至當我在這個地方web.config部分,:

<uri> 
    <schemeSettings> 
    <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> 
    <add name="https" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> 
    </schemeSettings> 
</uri> 

因爲我在中間id我不能使用{*id}的做法,拍攝包括action路線的其餘部分。

它看起來像我唯一的選擇是將/編碼爲符合RFC規範的字符,如!,但我不想使用控制器內的特設自定義代碼。我想要控制器收到完整的id,已經解碼。我希望我的Url.Action能夠生成正確編碼的URL。這是從MVC要求太多,還是我需要分散ActionFilters和自定義URL助手?

我能找到的唯一方法是拋出一個自定義IRouteConstraint來操縱它接收的RouteValueDictionary。這聽起來像一個骯髒的黑客:一個操縱其輸入的約束。上帝知道它的副作用。你認爲這是一個足夠理智的想法,還是有一個更好的ASP.NET MVC機制允許?

編輯:此解決方法僅適用於解析路徑時,不適用於生成路徑。

+1

你總是可以寫一個[自定義的HttpModule(HTTP:/ /stackoverflow.com/questions/7251285/iis-treats-double-encoded-forward-slashes-in-urls-differently-on-the-first-reque)來處理這個它到達MVC管道之前。 –

回答

1

你正在嘗試做無法做到的;這已經對SO回答幾次 - 關於RavenDb特別是最近,它使用「/」,在默認情況下,號碼字段(雖然這是可以改變的)

+3

對不起 - 過於簡單的答案。我應該說的是,看起來*並不是一個很好的方法來實現這一點。 –

+0

你的意思是自定義路由編碼無法完成?我不同意。如果我願意用我自己的UrlHelper和我本人ActionFilters或自定義模型粘合劑,它很可能有自定義編碼/解碼到位。我只是不想處理這個開銷。 –

+0

oops剛剛看到您的評論。 –