2012-02-24 72 views
1

我有一個控制器POST操作,使用RedirectToAction重定向到GET方法。RedirectToAction正在交換日期和月份

return RedirectToAction(SomeActionName, new { date = someModel.someUTCDate }); 

我已經實現了其解析使用假定文化和時區信息日期自定義模型粘結劑,所以我正確地攔截此。在我的問題的基本步驟:

  1. POST操作被調用的日期/時間字符串,這是GMT標準時間如果沒有指定,否則
  2. 定製模型綁定解析此日期爲DateTime帶着一種UTC,這是在正確的格式正確綁定到模型
  3. POST操作重定向使用RedirectToAction與被綁定爲UTC時間上的模型現在
  4. MVC3試圖綁定一個DateTime字符串值的日期爲GET月和日交換

在調用RedirectToAction和重新綁定GET操作的DateTime值之間的某處,正在發生字符串轉換,這似乎是交換月份和周圍的日子。

是否有一種簡單的方法來確保正確的字符串轉換髮生,而無需爲每個RedirectToAction調用手動轉換它?我真的很想知道這個路由值到字符串轉換的地方,以及我是否可以影響它進行正確的字符串轉換。

爲了說明我有什麼好一點,我有一個自定義DateTime模型綁定

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

    if (value == null || string.IsNullOrEmpty(value.AttemptedValue) || value.AttemptedValue == "null") 
    { 
     return null; 
    } 

    return FormatHelper.ConvertStringFromGMT(value.AttemptedValue); 
} 

在重定向我發現,該模型粘結劑的value.AttemptedValue是不正確的格式化字符串。

+0

你的意思是說,SomeActionName有一個日期作爲參數,該日期未正確綁定? – 2012-02-24 11:34:38

+0

我的意思是SomeActionName有一個日期作爲參數,並且我的自定義模型聯編程序正在接收不正確格式化的字符串以綁定此值。我爲date參數指定了一個DateTime值,並將其轉換爲MVC中字符串值,該值不正確地格式化。 – 2012-02-24 11:47:11

+0

我認爲轉換是在綁定到動作參數之前在ModelBinder中完成的。 DefaultModelBinder類使用不同的區域性設置來執行來自請求數據的不同 區域的類型轉換。從URL(路由和查詢字符串數據)獲得的值使用文化不敏感解析轉換爲 ,但從表單數據中獲得的值則將文化轉換爲 帳戶。 – 2012-02-24 11:56:32

回答

0

好了,現在問題已解決。據我所知,當MVC獲取重定向的路由值時,路由值將使用不變文化轉換爲查詢字符串參數。這只是幕後發生的一些魔法。我對這個問題的解決方案是重寫控制器方法RedirectToAction和RedirectToActionPermanent(帶有RouteValueDictionary的重載)。我遍歷RouteValueDictionary並使用定義的文化和時區信息在這裏轉換任何日期類型。幸運的是,我所有的控制器都已經從一個定製的基礎控制器繼承,所以修復很容易實現。

+0

你能展示如何覆蓋RedirectToAction來轉換日期類型嗎?我有同樣的問題,但我找不到如何轉換日期類型,而保留其他類型的默認邏輯不變。 – Magnus 2016-07-13 15:25:11

相關問題