2015-06-20 86 views
0

当使用@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(),因为我需要做一些逻辑的动作。)

+0

首先,遵循的命名约定。方法名称应以大写字母开头。 '_AddForm'不是一个方法的好名字。 为什么你甚至有'viewModel'作为你的子动作中的参数?这没有任何意义。 – ataravati

+0

只需从_AddForm()方法中删除'ViewModel viewModel'参数并初始化一个新实例(就像在Add()方法中那样)。模型绑定过程的第一步是初始化模型的新实例,并且因为SelectedValue是null(默认为可为int),并且因为它具有'[Required]'属性,所以错误是添加到'ModelState',因此将显示在视图中。或者,在Add()方法中设置“SelectedValue”的值。 –

回答

0

发生这种情况的原因,经过强类型的视图模型作为参数传递给动作导致在模型绑定和验证再次发生。

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

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

这种“高速缓存”竟然是在ModelState中:https://stackoverflow.com/a/7449628/1775471