2012-01-23 2 views
0

У меня есть RegisterModel, состоящий из 5 моделей SecretQuestionAndAnswerModelУплотненный MVC3 модель ни проверки, ни привязки

public class RegisterModel 
{ 
    public SecretQuestionAndAnswerModel SecretQuestion1 { get; set; } 
    public SecretQuestionAndAnswerModel SecretQuestion2 { get; set; } 
    public SecretQuestionAndAnswerModel SecretQuestion3 { get; set; } 
    public SecretQuestionAndAnswerModel SecretQuestion4 { get; set; } 
    public SecretQuestionAndAnswerModel SecretQuestion5 { get; set; } 
} 

и

public class SecretQuestionAndAnswerModel 
{ 
     public SecretQuestionTypeModel Type { get; set; } 

     [Required(ErrorMessage = "Please choose a question.")] 
     public int Id { get; set; } 
     public string Question { get; set; } 

     [Required] 
     [StringLength(20)] 
     public string Answer { get; set; } 

     [Display(Name = "Select Question")] 
     public IEnumerable<SelectListItem> DefaultQuestions { get; set; } 
} 

На моей основной Register.cshtml, я включать каждый вопрос, как это:

@Html.Partial("_QuestionAndAnswer", Model.SecretQuestion1, new ViewDataDictionary { { "Index", 1 }}) 

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

<div class="input"> 
     @{ 
      @Html.DropDownListFor(m => Model.Id, Model.DefaultQuestions, "(Please choose one)") 
      @Html.ValidationMessageFor(m => Model.Id) 

      @Html.TextBoxFor(m => m.Answer) 
      @Html.ValidationMessageFor(m => m.Answer) 
     } 
</div> 

Но проверки, все 5 вопросов, ведут себя как один: другими словами, если выбрать вопрос и введите ответ на 1-й секретный вопрос, то они все проверки проходят, и наоборот ...

Кроме того, на размещение в методе HttpPost регистр

public ActionResult Register(RegisterModel model) { ... 

model.SecretQuestion1 всегда нуль. Все они есть. Как вы выполняете такую ​​привязку привязки к модели? Я думал, что все будет хорошо.

ответ

1

Причина довольно очевидна, если вы посмотрите на сгенерированный HTML. Каждый элемент имеет одинаковый идентификатор и одно и то же имя. Не существует простого способа, чтобы модельное связующее могло сказать, что есть.

Это яркий пример различия между частичным представлением и шаблоном. Шаблоны имеют дополнительную логику для решения этой ситуации.

Вы должны, вместо того, чтобы создать шаблон SecretQuestionAndAnswerModel и использовать

@EditorFor(x => x.SecretQuestion1) 

Если вы не уверены в том, как работают шаблоны, прочитать:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

+0

Да, я мог видеть, что в HTML , но я хочу знать, почему это так. Теперь попробуйте шаблон редактора, спасибо –

+0

@RalphLavelle - причина в том, что частичные представления не знают, как иметь дело с двумя разными свойствами с тем же именем. –

+0

Hah! Вот и все, спасибо @MystereMan. Я люблю тебя прямо сейчас –

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