Как добавить ошибки проверки в коллекцию проверки asp.net mvc?
Внутри моего действия контроллера у меня есть следующий код:
public ActionResult GridAction(string id)
{
if (String.IsNullOrEmpty(id))
{
// add errors to the errors collection and then return the view saying that you cannot select the dropdownlist value with the "Please Select" option
}
return View();
}
UPDATE:
if (String.IsNullOrEmpty(id))
{
// add error
ModelState.AddModelError("GridActionDropDownList", "Please select an option");
return RedirectToAction("Orders");
}
ОБНОВЛЕНИЕ 2:
Вот мой обновленный код:
@Html.DropDownListFor(x => x.SelectedGridAction, Model.GridActions,"Please Select")
@Html.ValidationMessageFor(x => x.SelectedGridAction)
Модель выглядит следующим образом:
public class MyInvoicesViewModel
{
private List<SelectListItem> _gridActions;
public int CurrentGridAction { get; set; }
[Required(ErrorMessage = "Please select an option")]
public string SelectedGridAction { get; set; }
public List<SelectListItem> GridActions
{
get
{
_gridActions = new List<SelectListItem>();
_gridActions.Add(new SelectListItem() { Text = "Export to Excel", Value = "1" });
return _gridActions;
}
}
}
И вот мое действие с контроллером:
public ActionResult GridAction(string id)
{
if (String.IsNullOrEmpty(id))
{
// add error
ModelState.AddModelError("SelectedGridAction", "Please select an option");
return RedirectToAction("Orders");
}
return View();
}
Ничего не происходит! Я полностью потерял это!
ОБНОВЛЕНИЕ 3:
Теперь я использую следующий код, но все же проверка не запускается:
public ActionResult GridAction(string id)
{
var myViewModel= new MyViewModel();
myViewModel.SelectedGridAction = id; // id is passed as null
if (!ModelState.IsValid)
{
return View("Orders");
}
ОБНОВЛЕНИЕ 4:
$("#linkGridAction").click(function () {
alert('link grid action clicked');
$.get('GridAction/', { SelectedGridAction: $("#SelectedGridAction").val() }, function (result) {
alert('success');
});
});
И контроллер выглядит следующим образом:
// OrderViewModel has a property called SelectedGridAction.
public ActionResult GridAction(OrderViewModel orderViewModel)
{
return View();
}
ОБНОВЛЕНИЕ 5: проверка не срабатывает:
public ActionResult GridAction(OrderViewModel orderViewModel)
{
if (!ModelState.IsValid)
{
return View("Orders", orderViewModel);
}
return View();
}
Ответы
Ответ 1
Вы можете использовать модель представления:
public class MyViewModel
{
[Required]
public string Id { get; set; }
}
а затем:
public ActionResult GridAction(MyViewModel model)
{
if (ModelState.IsValid)
{
// the model is valid, the user has selected an id => use it
return RedirectToAction("Success");
}
return View();
}
UPDATE:
После сотен комментариев по моему ответу я чувствую необходимость представить полный рабочий пример:
Как обычно, начните с модели представления:
public class MyViewModel
{
[Required]
public string SelectedItemId { get; set; }
public IEnumerable<SelectListItem> Items
{
get
{
// Dummy data
return new SelectList(Enumerable.Range(1, 10)
.Select(i => new SelectListItem
{
Value = i.ToString(),
Text = "item " + i
}),
"Value", "Text");
}
}
}
Затем контроллер:
public class HomeController: Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
if (!ModelState.IsValid)
{
// The user didn't select any value => redisplay the form
return View(model);
}
// TODO: do something with model.SelectedItemId
return RedirectToAction("Success");
}
}
и, наконец, представление:
<% using (Html.BeginForm()) { %>
<%= Html.DropDownListFor(
x => x.SelectedItemId,
Model.Items,
"-- Select Item --"
) %>
<%= Html.ValidationMessageFor(x => x.SelectedItemId) %>
<input type="submit" value="OK" />
<% } %>
Ответ 2
Используйте ModelState.AddModelError()
ModelState.AddModelError("MyDropDownListKey", "Please Select");
и вывести на экран следующим образом:
<%= Html.ValidationMessage("MyDropDownListKey") %>
Ответ 3
Что касается вашего обновления № 3, я подозреваю, что это потому, что вы фактически назначаете это значение, его просто пустую строку (Required - проверка для null).
Вы хотите сделать это:
[Required(AllowEmptyStrings = false)]
Лучше всего было бы выполнить пользовательскую проверку (вы, скорее всего, захотите проверить, что ключ находится в списке и т.д.)
Изменить: исправлена опечатка в коде - забыли закрытие ")"