当使用@Html.Action()
获取PartialView时,我遇到了ModelState已经出现错误的问题。当使用Html.Action加载部分视图时,ModelState出现错误
我有以下控制器:
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);
}
}
而下面的视图模型:
public class ViewModel
{
[Required]
public int? SelectedValue { get; set; }
public SelectList List { get; set; }
}
添加视图看起来是这样的:
@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>
当此页面加载时,由于需要SelectedValue,所以ModelState在PartialView中已经有一个错误。
我不明白为什么会发生这种情况,当然_AddForm操作是一个HTTP GET并且不会导致模型状态验证?
(请注意,我不希望使用@Html.Partial()
,因为我需要做一些逻辑的动作。)
首先,遵循的命名约定。方法名称应以大写字母开头。 '_AddForm'不是一个方法的好名字。 为什么你甚至有'viewModel'作为你的子动作中的参数?这没有任何意义。 – ataravati
只需从_AddForm()方法中删除'ViewModel viewModel'参数并初始化一个新实例(就像在Add()方法中那样)。模型绑定过程的第一步是初始化模型的新实例,并且因为SelectedValue是null(默认为可为int),并且因为它具有'[Required]'属性,所以错误是添加到'ModelState',因此将显示在视图中。或者,在Add()方法中设置“SelectedValue”的值。 –