2014-02-23 36 views
4

我有這樣在HTTP GET中的MVC5 ViewModel綁定?

public ActionResult Overview(TimeAxisVM TimeAxis = null) 
{ 
    return View(new OverviewVM()); 
} 

查看這樣

public class TimeAxisVM 
{ 
    // omitted ctor 

    [DataType(DataType.DateTime)] 
    public DateTime? From { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime? To { get; set; } 
} 

的編輯模板視圖模型

@model TimeAxisVM 

@using (Html.BeginForm("Overview", "Controller", FormMethod.Get)) 
{ 
    @Html.EditorFor(model => model.From) 

    @Html.EditorFor(model => model.To) 

    <button type="submit">Submit</button> 
} 

而對於這樣的概述動作視圖模型的動作

@model OverviewVM 

@Html.EditorFor(model => model.TimeAxis) 

當我執行GET請求時,這是查詢字符串是TimeAxis.From = 22. + 02. + 2014 & TimeAxis.To = 25. + 02. + 2014但是一旦在動作TimeAxis.From和TimeAxis.To都是空的。

如果我將表單方法更改爲POST,它會立即按預期工作。從設計角度來看,這應該/必須是一個GET請求。

任何想法如何使模型綁定工作的GET?

UPDATE:

改變動作

public ActionResult Overview(DateTime? From = null, DateTime? To = null) 

併發送這種形式的請求:... /概述/從= 22 + 02 + 2014 &要= 25? + 02. + 2014也適用。

但我想保留它封裝在類中,並且不需要更改輸入字段名稱 - EditorFor將它們生成爲TimeAxis.From和TimeAxis.To。我可能會將其他屬性添加到ViewModel /表單。

+2

22. + 02. + 2014不是有效的日期字符串。您需要將其格式化爲22-02-2014之類的內容。要麼,要麼你將不得不創建一個自定義模型聯編程序來解析你的參數 –

+0

它在我的語言環境中有效,它們解析得很好。正如我所說,如果我使用POST它的作品。除非空格的編碼方式不同,否則不用'+' –

+0

這是什麼語言環境?我從來沒有聽說過使用空格和句點格式的日期字符串。 –

回答

2

我找到了答案。HTTP GET請求是文化不變的,而HTTP POST請求尊重ASP.NET MVC中的當前文化。

http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx

+0

啊..是的,當然。是的,這是有道理的。由於get是URL的一部分,因此URL必須適用於任何文化。只是去表現,現在事情你是多麼的有經驗,你仍然可以學習新事物... –

+0

我明白他們爲什麼這樣做。但用戶不會理解這一點。他仍然希望以他習慣的方式輸入日期。雖然您可以編寫自定義模型綁定器,但如果有一個配置選項可以從不變的GET處理切換到尊重Web.config中的全球化設置的處理器 –

0

如果您想再次使示範到視圖,你需要通過模型視圖回觀象

return View(TimeAxis); 

的話,我覺得你沒有一個叫控制器Controller你呢?您可能有HomeController或別的東西,不是嗎?

在這種情況下

,請修改您構成對

@using (Html.BeginForm("Overview", "Home", FormMethod.Get)) 

舉例來說,如果你是Overview行動是在Home控制器


一切的一切,你的控制器和視圖應該是:

public ActionResult Overview(TimeAxisVM TimeAxis) 
{ 
    return View(TimeAxis); 
} 

and

@using (Html.BeginForm("Overview", "Home", FormMethod.Get)) 
{ 
    @Html.EditorFor(Model => Model.From) 

    @Html.EditorFor(Model => Model.To) 

    <button type="submit">Submit</button> 
} 

這裏是上面代碼的截屏:http://screencast.com/t/7G6ofEq0vZEo

完整的源:http://ge.tt/1Uh80pK1/v/0?c

+0

它確實是@ Html.EditorFor(model => model.From)與小寫'm'。它是lambda函數參數,Model作爲模型傳遞給它(您可以隨意調用它)。好吧,我們稱它爲「家」,我不應該使用「控制器」作爲立場。我想要做返回視圖(新的OverviewVM()),;爲了清晰起見,隱藏了構造OverviewVM的方式。我認爲很明顯,OverviewVM將TimeAxis作爲一個屬性,對此表示遺憾。 –

+0

@balexandre - 這是不正確的。 「model」是lambda名稱,而Model是強類型Model對象的名稱,它將是無效的,並且不會編寫'@ Html.EditorFor(Model => Model.From)' –

+0

true,但您可以總是使用'模型'以及其他一切如果正確,它的工作。 - screencast:http://screencast.com/t/7G6ofEq0vZEo – balexandre