Ваша проблема (шаг за шагом)
- Ваш метод
SomeInformation()
устанавливает значение test1.Latitude
на «LATITUDE2».
- Затем эта модель передается в ваш метод
Index()
с использованием перегрузки из RedirectToAction
, который принимает объект. Внутренне это использует отражение для построения RouteValueDictionary
на основе свойств вашей модели (в данном случае просто latidute="LATITUDE2"
).
- Когда вы попали в
Index
метод модель привязывается на DefaultModelBinder
и теперь значение DataSiteList.Latitude
является «LATITUDE2» (именно поэтому вы вводите if
блок)
- В процессе связывания, то
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
, и теперь пользователи видят: «Я на следующей неделе!» и связанное сообщение об ошибке, которое имеет смысл для значения.
Так что, хотя вы думали, что «его нелогично», на самом деле существует определенная логика.
Установите скрипач и посмотрите, что на самом деле происходит, когда вы вызываете «RedirectToAction» - ваш ответ есть. – asawyer
Я никогда не использую Fiddler, не могу дать мне объяснение? –
'DataSiteList.Altitude! = Null' является ли это ошибкой или свойством« высота »в вашей модели« DataSites »? – Aymeric