使用@Html.Action()
获取PartialView时,我遇到了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);
}
}
以下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>
当此页面加载时,ModelState在PartialView中已经出现错误,因为需要SelectedValue。
我不明白为什么会发生这种情况,_AddForm操作肯定是HTTP GET并且不会导致模型状态验证?
(注意,我不想使用@Html.Partial()
因为我需要在Action中做一些逻辑。)
答案 0 :(得分:0)
发生这种情况的原因是将强类型ViewModel作为参数传递给操作会导致模型绑定和验证再次发生。
似乎没有办法避免这种重新验证。
我最初尝试使用Action作为一种方法来解决使用Html.Partial()
时MVC似乎缓存有关我的ViewModel的一些信息。
这个“缓存”原来是在ModelState中:https://stackoverflow.com/a/7449628/1775471