2011-07-09 51 views
0

控制器:值 「一些價值」 是無效的asp.net模型綁定驗證

public ActionResult EditTest() 
    { 
     return View(new EditTestViewModel("Is this a test?")); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult EditTest(EditTestViewModel test) 
    { 
     return View(new EditTestViewModel("Is this a test?")); 
    } 

視圖模型:

public class EditTestViewModel 
{ 
    public String test { get; set; } 

    public EditTestViewModel(String test) 
    { 
     this.test = test; 
    } 
} 

查看:

<% using (Html.BeginForm("EditTest", "Test", FormMethod.Post)) {%> 
    <%= Html.ValidationSummary(true) %> 
    <%= Html.TextBoxFor(model => model.test) %> 
    <%= Html.ValidationMessageFor(model => model.test) %> 
    <input type="submit" value="Save" /> 
<% } %> 

結果,當我點擊保存(不管我是否編輯數據):

值「這是測試嗎?」是 無效。

這是怎麼回事?

回答

0

當你運行這段代碼,你會得到和提交表單的第一個例外是:

[MissingMethodException: No parameterless constructor defined for this object.] 

這是因爲EditTestViewModel沒有參數的構造函數,你不能這樣使用它。

您的代碼的第二個問題是您在POST操作中創建了一個新對象,而不是重複使用作爲參數傳遞的對象。

因此,這裏是如何解決:

視圖模型:

public class EditTestViewModel 
{ 
    public String test { get; set; } 
} 

控制器:

public ActionResult EditTest() 
{ 
    var model = new EditTestViewModel 
    { 
     test = "Is this a test?" 
    } 
    return View(model); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditTest(EditTestViewModel test) 
{ 
    return View(model); 
} 

如果因爲某些原因,你想編輯POST操作的價值,這在視圖中反映,您需要將其從模型狀態中刪除,否則HTML助手將選擇舊值:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditTest(EditTestViewModel test) 
{ 
    model.test = "new value"; 
    ModelState.Remove("test"); 
    return View(model); 
} 
+1

是的,你是對的第一點。第二點 - 這只是一個測試,不應該是有道理的。雖然錯誤的實際原因是控制器參數名稱與類變量名稱相同,但它使活頁夾混淆! – BobTurbo

+0

+1你在跟我開玩笑嗎?經過一整天的調試,搜索網絡,清理項目,解決方案就是綁定程序混淆了。粘結劑很困惑?這是真的。所以燒在我的腦中,「粘結劑是困惑。困惑是粘結劑。粘結劑混淆.... – 2012-04-29 11:04:30

+0

至少拋出一些友善的建議你愚蠢的粘結劑。 – 2012-04-29 11:04:50