2011-05-27 76 views
1

在我的ASP.NET MVC 3應用程序,我有一個頁面,其形式提交後,我需要從形式改變的值。如果我在ViewModel中使用它,它不起作用,我必須使用ModelState["Field"].ValueASP.NET MVC 3 POST的ModelState和視圖模型

的事情是,我其實有很多工作我都對視圖模型時,頁面加載和POST之後做。所以我有一個接收ViewModel並完成所有工作的方法。但是,正如我所說的,在POST之後,修改ViewModel對象是沒有用的。這是爲什麼?控制器上的方法返回View(viewModel);。該視圖不應該使用ViewModel值嗎?

我想明白爲什麼沒用修改視圖模型,也知道如果在ModelState中的一些方法,「刷新」字段的值拋出一個視圖模型對象。

這裏是我的控制器代碼:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(MyViewModel viewModel) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
      //Do stuff and redirect 
    } 
    catch(Exception ex) 
    { 
     //Log and add error to the ModelState 
    } 

    someMethodWhichDoesALotOfThingsInTheViewModel(viewModel); 
    return View(viewModel); 
} 

我覺得代碼的其餘部分是不必要的,如果有人認爲這將有助於讓我知道!

更新

我不想失去任何錯誤,甚至這些領域中的視圖模型改變。一個很好的例子就是驗證碼,如果用戶在表單中發生任何錯誤(僅限於驗證碼字段或僅與其他字段而不驗證驗證碼),我想向他顯示所有錯誤並更新驗證碼。用舊的captcha值插入來渲染表單是沒有意義的,所以我想讓這個字段爲空。

更新2

我選擇把@Value = Model.PropertyInViewModel每個Html.TextBoxFor的HTML屬性。但我寧願避免這種討厭的工作,所以如果有人提出更好的解決方案,請讓我知道。

+0

如果你的方法進行了更改'viewModel',這是你傳遞到你的'Index'看法相同的對象。您向我們展示的代碼沒有任何問題 - 它必須位於其他位置。 – 2011-05-27 17:36:15

+0

我認爲它忽略了由於慣例所做的更改。如果在帖子後顯示相同的視圖,Html幫手將撤回嘗試的值。就像你沒有通過驗證一樣。嘗試清除ModelState錯誤。 – Jab 2011-05-27 21:08:44

+0

我更新了我的問題,請查看。 – Diego 2011-05-30 10:29:18

回答

0

我所能做的就是將@Value = Model.PropertyInViewModel添加到將在ViewModel中修改的每個Html.TextBoxFor

的另一種方式,如@Darin季米特洛夫說,是使我自己的助手。

4

下面的工作:

ModelState.Remove("MyProperty"); 
viewModel.MyProperty = "new value"; 

你需要從模型狀態中刪除它,因爲HTML助手先來看看在那裏結合自己的價值時。

+0

我不會失去這樣做的錯誤嗎? – Diego 2011-05-30 01:17:48

+0

@Diego,是的,你只會失去這個特定領域的錯誤。但是,這是正常的,因爲你已經改變了它的值,所以與用戶發佈的初始值相關的原始錯誤消息不再有意義。 – 2011-05-30 06:04:29

+0

我更新了我的問題,我真的不想失去任何錯誤,甚至那些在ViewModel中更改的字段。 – Diego 2011-05-30 10:28:54

0

如果您決定要刪除的ModelState值,以防止往返看看這個RemoveFor()擴展方法我做了刪除的ModelState錯誤,而神奇的字符串。