2014-10-30 3 views
39

У меня есть приложение MVC, которое отображает значение. Это контроллер:TextBoxДля отображения начального значения, а не значения, обновленного с кодом

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> 

И Model:

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

Когда я иду в/Home/SomeInformation, свойство DataSites 'Latitude устанавливается в "LATITUDE2". Затем перенаправляет на действие Index() в контроллере, устанавливает свойство «LATITUDE» и возвращает представление.

Когда он отображает представление, он отображает значение «LATITUDE2», как установлено в перенаправлении. Должна ли отображаться надпись «LATITUDE»?

+0

Установите скрипач и посмотрите, что на самом деле происходит, когда вы вызываете «RedirectToAction» - ваш ответ есть. – asawyer

+0

Я никогда не использую Fiddler, не могу дать мне объяснение? –

+1

'DataSiteList.Altitude! = Null' является ли это ошибкой или свойством« высота »в вашей модели« DataSites »? – Aymeric

ответ

81

Ваша проблема (шаг за шагом)

  1. Ваш метод SomeInformation() устанавливает значение test1.Latitude на «LATITUDE2».
  2. Затем эта модель передается в ваш метод Index() с использованием перегрузки из RedirectToAction, который принимает объект. Внутренне это использует отражение для построения RouteValueDictionary на основе свойств вашей модели (в данном случае просто latidute="LATITUDE2").
  3. Когда вы попали в Index метод модель привязывается на DefaultModelBinder и теперь значение DataSiteList.Latitude является «LATITUDE2» (именно поэтому вы вводите if блок)
  4. В процессе связывания, то DefaultModelBinder устанавливает ModelState значение Latitude в "LATITUDE2". Любые попытки установить значение Latitude теперь игнорируются, потому что в представлении используется значение ModelState значение для визуализации элемента управления.

Непонятно, что вы пытаетесь сделать здесь. Вы можете заставить его работать, как вы ожидаете, добавив ModelState.Clear(); в качестве первой строки вашего метода Index(). Это очищает все существующие значения ModelState, и теперь вы можете установить значение «LATITUDE».

Но ваш if блок не имеет смысла. Возможно, вы просто делали какой-то тест, но вы также можете удалить параметр из метода Index() и просто инициализировать новый экземпляр DataSites в методе.

Редактировать

Чтобы дать немного больше информации о том, почему не обновляет свойство модели не влияет раз ModelState был установлен.

Представьте, что у вас есть форму для сбора информации о пользователе, если модель содержит int Age.Пользователю предлагается ввести свой возраст, и кто-то входит «Мне пять на следующей неделе!». Конечно, это не связано с int, поэтому DefaultModelBinder добавляет значение (attemptedValue) и добавляет ModelStateError.

Когда представление возвращается, оно обычно отображает сообщение об ошибке, такое как «Поле Возраст должно быть числом». Если html-хелпер-рендеринг элемента управления использовал значение модели, тогда он отобразил бы «0» (значение по умолчанию для int). Было бы несколько сбивать с толку, если пользователь увидит «0» в текстовом поле, а затем появится сообщение о том, что оно должно быть числом (What !, но ноль - это число и что случилось с тем, что я ввел?). Поэтому вместо этого помощник использует значение от ModelState, и теперь пользователи видят: «Я на следующей неделе!» и связанное сообщение об ошибке, которое имеет смысл для значения.

Так что, хотя вы думали, что «его нелогично», на самом деле существует определенная логика.

-5

Вы не устанавливаете высоту. Это будет нулевой, так что код никогда не будет идти в этот блок и установите Lattitude в «Lattitude»

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

     return View(test); 
    } 
+0

Значение 'Altitude' ** устанавливается ** (в методе' SomeInformation'). Если блок 'if' не был удален, тогда в представлении будет отображаться пустая строка, а не« LATITUDE2 », как указано OP. –

+0

Мой ответ был отправлен до того, как OP зафиксировал этот раздел кода. Перед тем, как он был исправлен, в коде были установлены широта и контрольная высота. Теперь, код устанавливает Локатор проверяет Широта ... не высоту, как у вас в вашем комментарии. – Keith

+2

Высота или Широта не имеет значения. Это абсолютно не связано с проблемой OP. –

Смежные вопросы