Другое событие 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));
}
Проблема заключается в том, что 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");
}
Мне кажется, что это более правильное поведение.
Помощники html считывают значение из ModelState. И нет элегантного способа переопределить это поведение.
Но если вы добавите эту строку после SaveToDB(ID, SomeText)
, она должна работать:
ModelState["SomeText"].Value =
new ValueProviderResult("", "", CultureInfo.CurrentCulture);
Это поведение клиентов. Я бы рекомендовал использовать javascript. Если вы используете JQuery, вы можете сделать это следующим образом:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
Я больше не использую Javascript, но считаю, что в регулярном JS это похоже:
document.getElementById("SomeText").value = "";
(Вы сделали бы это в одном из событий загрузки.
<body onload="...">
Надеюсь, это поможет.
Вместо использования ModelState.Clear (), который очищает все модельное состояние, вы можете сделать ModelState.Remove («SomeText»), если хотите. Или визуализируйте Input без htmlhelper-extensions. Они предназначены для принятия значения из ModelState вместо Model (или viewdata).
Я все пробовал, но работал только тогда, когда делал что-то вроде этого:
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));
Надеюсь, это поможет.
Делает это. например:
добавить:
ModelState.Clear();
перед оператором return
метода действия кнопок отправки. Работает на меня. Это может сработать для вас.
Я достаточно уверен, что textarea захватывает значение из Request.Form под капотом, поскольку ViewData ["SomeText"] пуст.
Проблема в том, что ваш ModelState повторно заполнен опубликованными значениями.
Что вы можете сделать, это очистить его от действия, которое имеет атрибут Post:
ModelState.Clear();
Возможно ли, что состояние модели обновлено с ошибкой? Я считаю, что он вытащит попытку из состояния модели, а не из данных вида или модели, если состояние модели недействительно.
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);
ModelState
даже после публикации и использованияRedirectToAction("save", new{ id = 0});
в концеSave(MyModel vm)
? Что я могу сделать, чтобы сбросить форму после публикации ее, кромеModelState.Clear()
? – barnes 20 November 2016 в 10:07UpdateTargetId
изAjax.BeginForm
был предоставлен неверныйId
. – barnes 20 November 2016 в 10:33