3

我完全難住了。
我在MVC2做searchform(我已經在這個項目上,一切工作正常進行十餘人。)
Global.asax中有這條路線:Html.DisplayFor和Html.EditorFor顯示不同的值

routes.MapRoute("OnlineHelpSearchIndex", 
          "Help/Search/{expression}/{page}", 
          new { controller = "OnlineHelp", action = "Search", expression = UrlParameter.Optional, page=1 }); 

的表達是一個base64編碼字符串。我在控制器中解碼它,將它傳遞給一個名爲Expression的屬性的模型,並將其顯示在TextBox中的PartialView中。 (然後,當用戶點擊一個鏈接或按下回車,我編碼字符串中的javascript並將其發送到"/Help/Search/"+value

我已經建立了這種方式(每一個路線SomeModule/Search/{expression}),其中一個幾個searchboxes不工作。

<%:Html.DisplayFor(m => m.Expression)%> 
<%: Model.Expression %> 
<%:Html.TextAreaFor(m => m.Expression)%> 
<%:Html.TextBoxFor(m => m.Expression)%> 
<%:Html.EditorFor(m => m.Expression)%> 

前兩個顯示正確的表達式,另外三個顯示url中的表達式。
我試圖硬編碼一個字符串到模型中,前兩個顯示硬編碼的字符串,其他三個顯示在URL中的任何內容。 這怎麼可能?
(我甚至試圖與JS禁用,所以它是一個服務器端的問題)

回答

1

試圖改變名稱中都routes.MapRoute並在OnlineHelp/Search控制器/操作方法expression參數

routes.MapRoute("OnlineHelpSearchIndex", 
          "Help/Search/{exprs}/{page}", 
          new { controller = "OnlineHelp", action = "Search", exprs = UrlParameter.Optional, page=1 }); 

(或者,如果您願意,可以更改模型的Expression屬性的名稱)。

這種情況經常發生與HtmlHelper方法,如TextBoxFor/EditorFor,當ViewModel具有共享Router/Controller參數同名的一個或多個屬性創建表單字段工作:您可以輕鬆地檢查這個看着生成的HTML代碼,由HtmlHelper方法創建的輸入類型字段最有可能具有導致整個問題的id='Expression'屬性。

+0

但是,爲什麼它適用於除我的兩個案件之外的所有案件? – TDaver 2012-02-26 09:05:25

+0

你說*他們中的一個*不工作,對吧?你提到的情況正如預期的那樣工作:'Html.DisplayFor'和'Model.Expression'不會產生一個輸入類型的字段,所以它們不會被影響/覆蓋,其他三種情況。 – Darkseal 2012-02-26 11:24:44

+0

不,我的意思是'<%:Html.TextBoxFor(m => m。表達式)%>'在兩個地方都可以工作。 – TDaver 2012-02-26 13:29:50

0

我知道這是一箇舊線程,但我想我會回答它。這是發生的原因是故意的,這是由於ModelState。看到這個問題的另一種情況: Asp.net MVC ModelState.Clear

長話短說,你正在發佈表單數據到控制器並返回一個視圖,並使用助手。因此,MVC假定這是驗證失敗並返回ModelState值,而不是模型數據的值。前兩個顯示正確,因爲它們不是編輯器,其他3個是編輯器,所以它們顯示ModelState。

要麼在控制器中調用ModelState.Clear()以將其吹掉,要麼實現另一種設計模式,例如POST,Redirect,GET。

相關問題