Ответ 1
Ваша проблема (шаг за шагом)
- Ваш метод
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
.
Когда представление возвращается, оно обычно отображает сообщение об ошибке, такое как "Поле Age должно быть числом". Если html-хелпер-рендеринг элемента управления использовал значение модели, тогда он отобразил бы "0" (значение по умолчанию для int). Было бы несколько запутанным для пользователя видеть "0" в текстовом поле, а затем сообщение, в котором должно быть указано число ( "Что!", Но "нуль" - это число и что случилось с тем, что я ввел?). Поэтому вместо этого хелпер использует значение из ModelState
, и теперь пользователи видят: "Мне пять на следующей неделе!" и связанное с ним сообщение об ошибке, которое имеет смысл для значения.
Итак, хотя вы думали, что "это нелогично", на самом деле существует некоторая логика этого поведения.