2014-10-30 67 views
39

我有一個MVC應用程序,顯示一個值。這是控制器:TextBoxFor顯示初始值,而不是從代碼更新的值

public ActionResult Index(DataSites DataSiteList) 
{ 
    if (DataSiteList.Latitude != null) 
    { 
     DataSites test = new DataSites(); 
     test.Latitude = "LATITUDE"; 

     return View(test); 
    } 
    return View(DataSiteList); 
} 
public ActionResult SomeInformation() 
{ 
    DataSites test1 = new DataSites(); 
    test1.Latitude = "LATITUDE2"; 

    return RedirectToAction("Index", test1); 
} 

的觀點:

@model miniproj2.Models.DataSites 

<p> 
    @Html.TextBoxFor(x => x.Latitude) 
</p> 

和模型:

public class DataSites 
{ 
    public string Latitude { get; set; } 
} 

當我去到/ home/SomeInformation的DataSitesLatitude屬性設置爲「LATITUDE2」。然後重定向到控制器中的Index()操作,將屬性設置爲「LATITUDE」並返回視圖。

當它顯示視圖時,它將顯示重定向中設置的值「LATITUDE2」。不應該顯示「LATITUDE」?

+0

安裝小提琴手並觀察當您調用RedirectToAction時實際發生的情況 - 您的答案就在那裏。 – asawyer 2014-10-30 13:54:23

+0

我從來沒有使用過提琴手,你能給我一個解釋嗎? – 2014-10-30 13:58:15

+1

'DataSiteList.Altitude!= null'它是拼寫錯誤還是'altitude'屬性實際存在於模型'DataSites'中? – Aymeric 2014-10-30 13:58:29

回答

81

你的問題是(循序漸進)

  1. SomeInformation()方法設置的test1.Latitude 值到「LATITUDE2」。
  2. 然後,您使用接受對象的 的RedirectToAction的過載方法將該模型傳遞給您的方法。在內部,這使用 反射來建立一個RouteValueDictionary根據您的模型的屬性 (在這種情況下它簡單地latidute="LATITUDE2")。
  3. 當你點擊Index方法的模型由DefaultModelBinder約束,現在的DataSiteList.Latitude值爲「LATITUDE2」(這就是爲什麼你進入 的if塊)
  4. 在結合過程中,DefaultModelBinder設置 ModelStateLatitude的值爲「LATITUDE2」。任何試圖設置 的值Latitude現在都被忽略,因爲視圖使用 ModelStateModelState值來呈現控件。

不清楚你在這裏做什麼。您可以按照預期方式使其工作,方法是將ModelState.Clear();作爲Index()方法的第一行。這將清除所有現有的ModelState值,您現在可以將該值設置爲「LATITUDE」。

但您的if塊沒有意義。也許你只是在做某種測試,但你也可以從Index()方法中刪除參數,並在方法中初始化一個新的DataSites實例。

編輯

爲了給至於爲什麼更新模型屬性沒有影響,一旦ModelState已設置更多的信息。

想象一下,您有一個表單來收集用戶信息,其中模型包含int Age。要求用戶輸入他們的年齡,並且有人輸入「我下週五歲!」。當然,這不會綁定到一個int,所以DefaultModelBinder增加值(attemptedValue)並添加ModelStateError

當視圖返回時,它通常會顯示一條錯誤消息,如「字段年齡必須是數字」。如果呈現控件的html助手使用了模型值,那麼它將顯示「0」(int的默認值)。如果用戶在文本框中看到「0」並且接下來顯示一條消息說它必須是一個數字(什麼,但是零是一個數字,我輸入什麼內容?)會讓人有些困惑。相反,該幫手使用ModelState的值,現在用戶看到「我是下週五!」以及對該值有意義的相關錯誤消息。

所以,即使你的想法是「它不合邏輯」,實際上這種行爲有一些邏輯。

-5

您未設置高度。它將爲空,因此該代碼將不會進入該塊,並設置Lattitude爲「LATTITUDE」

if (DataSiteList.Altitude != null) 
    { 
     DataSites test = new DataSites(); 
     test.Latitude = "LATITUDE"; 

     return View(test); 
    } 
+0

設置'Altitude **'的值(在'SomeInformation'方法中)。如果'if'塊沒有被擊中,那麼該視圖將顯示一個空字符串,而不是OP所述的「LATITUDE2」。 – 2014-10-30 22:18:39

+0

我的答案是在OP之前提交的,修復了代碼段。在修復之前,代碼設置了「緯度」和「檢查高度」。現在,代碼設置Latitude檢查Latitude ...不是高度,就像您在評論中一樣。 – Keith 2014-10-31 09:44:40

+2

高度或緯度沒有區別。這與OP的問題完全沒有關係。 – 2014-10-31 20:39:11