2012-02-08 2 views
2

У меня довольно простой вид бритвы, который необходимо использовать для вопросника, который используется повторно, пока не закончится вопрос. Флажок используется для выбора ответов, проблема в том, что когда я впервые отправлю форму, когда следующий набор вопросов вернул ответы, которые я отправляю в первый раз, они сохраняются на второй странице. Для простоты я сократил программу следующим образом,MVC3 значение флажка не очищается

модель,

public class CheckBoxItemDto 
{ 
    public int Id { get; set; } 

    public bool Selected { get; set; } 
} 

public class CheckBoxModel 
{ 
    public CheckBoxModel() 
    { 
     Dtos = new List<CheckBoxItemDto>(); 
    } 

    public IList<CheckBoxItemDto> Dtos { get; set; } 
} 

контроллер,

public class CheckBoxController : Controller 
{ 
    public ViewResult Index() 
    { 
     CheckBoxModel model = new CheckBoxModel(); 
     for (int i = 0; i < 5; i++) 
     { 
      model.Dtos.Add(new CheckBoxItemDto(){Id = i,Selected = true}); 
     } 
     return View(model); 
    } 

    [HttpPost] 
    public ViewResult Index(CheckBoxModel mdl) 
    { 
     CheckBoxModel model = new CheckBoxModel(); 
     for (int i = 5; i < 10; i++) 
     { 
      model.Dtos.Add(new CheckBoxItemDto() { Id = i, Selected = i % 2 == 0 }); 
     } 
     return View(model); 
    } 
} 

View,

@model CheckBoxTest.Models.CheckBoxModel 

@{ 
    ViewBag.Title = "ViewPage1"; 
} 

<h2>ViewPage1</h2> 
@using (Html.BeginForm()) 
{ 
for (int i = 0; i < Model.Dtos.Count; i++) 
{ 
    @Html.DisplayFor(m => m.Dtos[i].Id) 
    @Html.DisplayFor(m => m.Dtos[i].Selected) 
    @Html.CheckBoxFor(m => m.Dtos[i].Selected) 
    <br/> 
} 
<input type="submit" value="Index" /> 
} 

В представлении после поста, Displayfor и Значения столбцов CheckBoxFor различны. Но это должно быть одинаково.

ответ

8

По его звуку ваш ModelState по-прежнему сохраняет свои предыдущие значения, когда вы возвращаете представление. Попробуйте очистки ModelState в вашем почтовом действии:

ModelState.Clear(); 
CheckBoxModel model = new CheckBoxModel(); 
... 
+0

Работает как очарование. Спасибо. –

1

В вашем методе действия Index, который получает работать на POST, ASP.Net MVC ожидает полученный View, чтобы отобразить ошибки проверки. Поэтому метод HTML Helper CheckBoxFor выглядит в ModelState до Model, поэтому он может отображать «недопустимое» значение для пользователя.

Если вы не используете представление из действия POST для отображения ошибок, вы можете очистить ModelState как Dangerous suggests. Или вы можете использовать шаблон «Post-Redirect-Get»: в вашем методе POST-действия отобразите один и тот же «Вид», если есть ошибки, или перенаправляют на представление GET, которое отображает что-то еще.