2011-01-29 72 views
41

我有一個多步驟文件導入過程。我在我的視圖中有一個隱藏的表單輸入,我試圖從視圖模型中填充「CurrentStep」。Hiddenfor從視圖模型中獲取的值不正確

<% = Html.HiddenFor(model => model.CurrentStep) %> 

CurrentStep是一個枚舉,我總是得到默認值,而不是我提供給視圖模型的默認值。在另一方面,這讓我正確的值:

<p><% = Model.CurrentStep %></p> 

我知道我可以隻手代碼隱藏的輸入,但我想知道:我究竟做錯了什麼?有沒有更好的方法來跟蹤POST之間的當前步驟?

在此先感謝。

+0

請向我們展示您的表單的代碼(例如Html.BeginForm())。 – 2011-01-29 15:50:16

回答

62

你在做什麼錯了,是你正試圖修改你的控制器操作中POST變量的值。所以,我想你正在努力做到這一點:

[HttpPost] 
public ActionResult Foo(SomeModel model) 
{ 
    model.CurrentStep = Steps.SomeNewValue; 
    return View(model); 
} 

和HTML輔助等HiddenFor總是會首先使用張貼的價值後模型的價值。

所以,你有幾個可能的原因:

  1. 從ModelState中刪除值:

    [HttpPost] 
    public ActionResult Foo(SomeModel model) 
    { 
        ModelState.Remove("CurrentStep");    
        model.CurrentStep = Steps.SomeNewValue; 
        return View(model); 
    } 
    
  2. 手動生成的隱藏字段

    <input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" /> 
    
  3. 編寫自定義幫手將使用你的模型的價值,而不是那個ING POST方法

+2

謝謝。我認爲視圖模型的全部要點是將複雜的(比ViewData至少應該包含的更復雜的)信息傳遞給視圖。所以視圖不使用我傳遞給它的視圖模型?它只是獲得POST變量中的所有內容?這對我來說沒有多大意義。 – user427875 2011-01-29 23:38:32

4

我的解決辦法是使用Darin的第二個選項,因爲選項1(從模型狀態結算)是指硬編碼字符串(和命名規則可能會非常棘手複雜的模型),並希望避免選項3,因爲我已經有了這麼多的定製助手。

<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />

只是一個提醒,你可以用Html.NameFor保持乾淨的東西。

相關問題