У меня возникла проблема с ModelState, которая уже имеет ошибки при получении PartialView с использованием @Html.Action()
.ModelState имеет ошибки при загрузке частичного представления с использованием Html.Action
У меня есть следующий контроллер:
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
public class TestController : Controller
{
private readonly object[] items = {new {Id = 1, Key = "Olives"}, new {Id = 2, Key = "Tomatoes"}};
[HttpGet]
public ActionResult Add()
{
var model = new ViewModel {List = new SelectList(items, "Id", "Key")};
return View(model);
}
public ActionResult _AddForm(ViewModel viewModel)
{
var errors = ModelState.Where(m => m.Value.Errors.Count > 0).ToArray();
return PartialView(viewModel);
}
}
И следующий ViewModel:
public class ViewModel
{
[Required]
public int? SelectedValue { get; set; }
public SelectList List { get; set; }
}
Вид Add выглядит следующим образом:
@model ViewModel
<h1>Add a thing to a list</h1>
@using (Html.BeginForm())
{
@Html.ValidationSummary()
@Html.Action("_AddForm", Model)
<button class="btn btn-success">Submit</button>
}
Наконец _AddForm PartialView выглядит следующим образом :
@model ViewModel
<div class="form-group">
@Html.ValidationMessageFor(m => m.SelectedValue)
@Html.LabelFor(m => m.SelectedValue, "Please select a thing:")
@Html.DropDownListFor(m => m.SelectedValue, Model.List, new {@class = "form-control"})
</div>
Когда эта страница загружается, ModelState уже имеет ошибку в PartialView, потому что требуется значение SelectedValue.
Я не понимаю, почему это происходит, конечно, действие _AddForm является HTTP GET и не вызывает проверку состояния модели?
(Обратите внимание, что я не хочу использовать @Html.Partial()
потому, что мне нужно сделать некоторую логику в действии.)
Прежде всего, следовать соглашению об именах. Имя метода должно начинаться с заглавной буквы. '_AddForm' не является хорошим именем для метода. Почему у вас даже есть 'viewModel' в качестве параметра в вашем дочернем действии? Это не имеет никакого смысла. – ataravati
Просто удалите параметр ViewModel viewModel' из метода '_AddForm()' и инициализируйте новый экземпляр (как и в методе 'Add()'). Первым шагом в процессе привязки к модели является то, что новый экземпляр вашей модели инициализируется и потому что 'SelectedValue' является' null' (по умолчанию для nullable int), и поскольку он имеет атрибут '[Обязательный]', ошибка добавлен в «ModelState», поэтому он будет отображаться в представлении. Альтернативно, установите значение 'SelectedValue' в методе' Add() '. –