Подтвердить что ты не робот

TextBoxДля отображения начального значения, а не значения, обновленного из кода

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

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, свойство DataSites 'Latitude имеет значение "LATITUDE2". Затем перенаправляет на действие Index() в контроллере, устанавливает свойство "LATITUDE" и возвращает представление.

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

4b9b3361

Ответ 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, и теперь пользователи видят: "Мне пять на следующей неделе!" и связанное с ним сообщение об ошибке, которое имеет смысл для значения.

Итак, хотя вы думали, что "это нелогично", на самом деле существует некоторая логика этого поведения.

Ответ 2

Вы не устанавливаете высоту. Он будет null, поэтому код никогда не войдет в этот блок и не установит Lattitude на "LATTITUDE"

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

        return View(test);
    }