Изменение свойств объекта не обновляется [duplicate]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

28
задан Deduplicator 2 November 2014 в 17:58
поделиться

9 ответов

Проблема заключается в том, что HtmlHelper извлекает значение ModelState, которое заполняется опубликованными данными. Вместо того, чтобы взломать это, сбросив ModelState, почему бы не перенаправить обратно на действие [get]. Действие [post] также может установить сообщение о временном статусе следующим образом:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Message(int ID, string SomeText)
{
  // save Text to database
  SaveToDB(ID, SomeText);

  TempData["message"] = "Message sent";
  return RedirectToAction("Message");
}

Мне кажется, что это более правильное поведение.

39
ответ дан roryf 18 August 2018 в 19:30
поделиться
  • 1
    Я думаю, что это лучше, чем просто очистка ModelState. Если вы делаете сообщение, то вам действительно не нужно больше, чем просто возвращение сообщения. Если вы почувствуете необходимость вернуть полную модель, то, вероятно, вам, вероятно, придется попасть в первую очередь. Также посмотрите на шаблон PRG; это может прояснить это немного. Это также может исправить это раздражающее сообщение браузера, которое вы иногда можете получить при обновлении, и спрашивает, хотите ли вы повторно отправить форму. – Landon Poch 26 August 2013 в 19:34
  • 2
    Я делаю именно это, и он работает над большинством моих форм, за исключением нескольких (возможно, 2 или 3). Почему страница все еще передает значения из ModelState даже после публикации и использования RedirectToAction("save", new{ id = 0}); в конце Save(MyModel vm)? Что я могу сделать, чтобы сбросить форму после публикации ее, кроме ModelState.Clear()? – barnes 20 November 2016 в 10:07
  • 3
    Я нашел решение. UpdateTargetId из Ajax.BeginForm был предоставлен неверный Id. – barnes 20 November 2016 в 10:33

Помощники html считывают значение из ModelState. И нет элегантного способа переопределить это поведение.

Но если вы добавите эту строку после SaveToDB(ID, SomeText), она должна работать:

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);
7
ответ дан Çağdaş Tekin 18 August 2018 в 19:30
поделиться
  • 1
    Спасибо, решил мою проблему и был очень полезен! – Ryan Sampson 2 September 2011 в 04:44

Это поведение клиентов. Я бы рекомендовал использовать javascript. Если вы используете JQuery, вы можете сделать это следующим образом:

<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>

Я больше не использую Javascript, но считаю, что в регулярном JS это похоже:

document.getElementById("SomeText").value = "";

(Вы сделали бы это в одном из событий загрузки.

<body onload="...">

Надеюсь, это поможет.

0
ответ дан Jeff Ancel 18 August 2018 в 19:30
поделиться
  • 1
    Я так не думаю. Представление будет отображаться на стороне сервера перед тем, как быть нажатым в мой браузер. – xraminx 25 April 2009 в 01:28
  • 2
    Я согласен, но я решил быстро исправить ситуацию. Не совсем уверен, почему он так возвращается. Он всегда делал это для меня на почте, подумал, что это особенность. – Jeff Ancel 25 April 2009 в 04:56

Вместо использования ModelState.Clear (), который очищает все модельное состояние, вы можете сделать ModelState.Remove («SomeText»), если хотите. Или визуализируйте Input без htmlhelper-extensions. Они предназначены для принятия значения из ModelState вместо Model (или viewdata).

1
ответ дан Kirsten 18 August 2018 в 19:30
поделиться

Я все пробовал, но работал только тогда, когда делал что-то вроде этого:

ModelState.Clear();
//This will clear the address that was submited
viewModel.Address = new Address();
viewModel.Message = "Dados salvos com sucesso!";
return View("Addresses", ReturnViewModel(viewModel));

Надеюсь, это поможет.

1
ответ дан MalachiteBR 18 August 2018 в 19:30
поделиться

Делает это. например:

добавить:

ModelState.Clear();

перед оператором return метода действия кнопок отправки. Работает на меня. Это может сработать для вас.

0
ответ дан Maximilian Ast 18 August 2018 в 19:30
поделиться

Я достаточно уверен, что textarea захватывает значение из Request.Form под капотом, поскольку ViewData ["SomeText"] пуст.

0
ответ дан Mike Geise 18 August 2018 в 19:30
поделиться
  • 1
    Итак, вы предлагаете правильный способ сделать это следующее: Request.Form ["SomeMessage"] = string.Empty; – xraminx 25 April 2009 в 01:49
  • 2
    Нет. Request.Form не используется расширением HtmlHelper. – tvanfosson 25 April 2009 в 01:54
  • 3
    Я бы этого не сказал. Вы можете назвать заголовок параметра querystring и иметь текстовое поле с названием названия, а TextBox будет иметь значение строки запроса. Кроме того, они вытягивают свои значения из Request.Form, как еще он получит значения, чтобы заполнить форму или вернуть результаты при публикации формы. – Mike Geise 25 April 2009 в 02:01

Проблема в том, что ваш ModelState повторно заполнен опубликованными значениями.

Что вы можете сделать, это очистить его от действия, которое имеет атрибут Post:

ModelState.Clear();
68
ответ дан Olivier Payen 18 August 2018 в 19:30
поделиться
  • 1
    Это должно быть отмечено как лучший ответ. Мне нужно было сохранить логическое значение в ViewBag, а функция RedirectToAction () удаляет из него данные. – DaveWut 8 May 2014 в 21:25

Возможно ли, что состояние модели обновлено с ошибкой? Я считаю, что он вытащит попытку из состояния модели, а не из данных вида или модели, если состояние модели недействительно.

EDIT: я включаю соответствующий раздел исходного кода из расширения TextArea HtmlHelper ниже. Мне кажется, что он делает именно то, что я ожидал - если была ошибка модели, она вытягивает значение из состояния модели, иначе оно использует его из ViewData. Обратите внимание, что в вашем методе Post ключ «SomeText» не должен существовать до его установки, т. Е. Он не будет перенесен с версии кода, который отвечает на GET.

Поскольку вы явно указываете значение ViewData, useViewData должно быть ложным, attemptedValue должно быть ложным, если в состоянии модели не было установлено значение ошибки.

    // If there are any errors for a named field, we add the css attribute.
    ModelState modelState;
    if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) {
        if (modelState.Errors.Count > 0) {
            tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
        }
    }

    // The first newline is always trimmed when a TextArea is rendered, so we add an extra one
    // in case the value being rendered is something like "\r\nHello".
    // The attempted value receives precedence over the explicitly supplied value parameter.
    string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
    tagBuilder.SetInnerText(Environment.NewLine + (attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : value)));
    return tagBuilder.ToString(TagRenderMode.Normal);
0
ответ дан tvanfosson 18 August 2018 в 19:30
поделиться
  • 1
    Я не думаю, что были ошибки. У меня была та же проблема в другой форме. Я уже несколько дней царапаю голову, но я не мог понять, почему это происходит. Это довольно раздражает, когда вы не контролируете то, что появляется в вашей форме после post action. Мне было интересно, что я делаю что-то необычное или неправильное. – xraminx 25 April 2009 в 01:25
Другие вопросы по тегам:

Похожие вопросы: