我有一個問題出現在我嘗試發佈的表單中。在表單未驗證的情況下,我將調用ModelState.AddModelError()
的標準路由,然後返回View結果。ASP.Net MVC ModelState/Html.TextBox回發問題
問題是,HTML。*助手應該在呈現時拾取發佈的值,並且我注意到我的文本字段只有在將它們包含在回發操作的參數列表中時纔會這樣做,由於某些表單有太多的字段需要將它們全部列爲參數,因此不需要查看。
我的動作代碼大致是:
Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>
:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
var dataDefinition = ...
// do some validation stuff
if (!ModelState.IsValid)
{
// manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
// ...
return View(dataDefinition);
}
}
現在,dataDefinition(這是一個LINQ到SQL實體)具有場MinVolume,在視圖中由這一行處理
然而,當ModelState驗證失敗後呈現視圖時,我們發佈的原始頁面中鍵入的值將不會保留,除非將其作爲參數包含在回發方法中。從字面上看,我可以通過這樣做來「解決問題」:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)
由於某些原因,將強制保留字段值。這對我來說似乎很愚蠢,因爲我的表單的方式更多,而且我不應該爲該字段添加參數。
任何想法?
不,指定null應該指定現有的模型上下文應該用於查詢值。指定MinVolume是明確的,並會強制使用該值而不是以前提交的值。 – 2009-05-13 08:37:13
不正確。指定MinVolume將查找ViewDataDoctionary,然後查找ModelStateDictionary以查找後續帖子。因此,如果Model.MinVolume說5 becore編輯,然後指定MinVolume將5放入文本框。然後,如果發佈了一個帖子(比如說值3)但是發現無效,那麼TextBox將在第二輪顯示3。你試過了嗎?您通常在「新建」或「創建」視圖上指定空值,以便初始帖子在字段中顯示爲空,隨後的帖子會保留輸入的值。 – 2009-05-13 09:20:28
這正是我每次都這樣做的方式。我從來沒有見過任何你必須指定null的地方。一個鏈接到你看到的地方會很好。 – sirrocco 2009-05-18 16:13:49