2015-06-20 8 views
0

У меня возникла проблема с ModelState, которая уже имеет ошибки при получении PartialView с использованием @Html.Action().ModelState имеет ошибки при загрузке частичного представления с использованием Html.Action

У меня есть следующий контроллер:

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; } 
} 

Вид Add выглядит следующим образом:

@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() потому, что мне нужно сделать некоторую логику в действии.)

+0

Прежде всего, следовать соглашению об именах. Имя метода должно начинаться с заглавной буквы. '_AddForm' не является хорошим именем для метода. Почему у вас даже есть 'viewModel' в качестве параметра в вашем дочернем действии? Это не имеет никакого смысла. – ataravati

+0

Просто удалите параметр ViewModel viewModel' из метода '_AddForm()' и инициализируйте новый экземпляр (как и в методе 'Add()'). Первым шагом в процессе привязки к модели является то, что новый экземпляр вашей модели инициализируется и потому что 'SelectedValue' является' null' (по умолчанию для nullable int), и поскольку он имеет атрибут '[Обязательный]', ошибка добавлен в «ModelState», поэтому он будет отображаться в представлении. Альтернативно, установите значение 'SelectedValue' в методе' Add() '. –

ответ

0

Причина это происходит, что пропускание сильно типизированных ViewModel в качестве параметра к действию вызывает привязка модели и проверка правильности повторения.

Кажется, нет способа избежать повторной проверки.

Первоначально я попытался использовать действие как способ обойти способ, которым MVC, казалось, кэшировал некоторую информацию о моей ViewModel при использовании Html.Partial().

Это «кэширование» оказался в ModelState: https://stackoverflow.com/a/7449628/1775471

 Смежные вопросы

  • Нет связанных вопросов^_^