【问题标题】:ModelState has errors when loading partial view using Html.Action使用 Html.Action 加载局部视图时,ModelState 出现错误
【发布时间】:2015-09-06 10:12:22
【问题描述】:

在使用 @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中做一些逻辑。)

【问题讨论】:

  • 首先,遵循命名约定。方法名称应以大写字母开头。 _AddForm 不是一个好名字的方法。为什么您甚至在您的子操作中将viewModel 作为参数?这没有任何意义。
  • 只需从_AddForm() 方法中删除ViewModel viewModel 参数并初始化一个新实例(就像您在Add() 方法中所做的那样)。模型绑定过程的第一步是初始化模型的新实例,因为 SelectedValuenull(可为 null 的 int 的默认值)并且因为它具有 [Required] 属性,所以会添加一个错误ModelState 因此将显示在视图中。或者,在Add() 方法中设置SelectedValue 的值。

标签: asp.net-mvc asp.net-mvc-5 modelstate


【解决方案1】:

发生这种情况的原因是,将强类型 ViewModel 作为参数传递给操作会导致模型绑定和验证再次发生。

似乎没有办法避免这种重新验证。

我最初尝试使用 Action 来绕过 MVC 在使用 Html.Partial() 时似乎缓存有关我的 ViewModel 的一些信息的方式。

这个“缓存”原来是在 ModelState 中:https://stackoverflow.com/a/7449628/1775471

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多