2013-04-02 3 views
0

Я смотрел на SO и google уже более недели и до сих пор не смог найти рабочий ответ. Надеюсь, кто-то может мне помочь.Просмотр не передачи данных контроллеру

Im работает над проектом с asp.net (Entity Framework + Razor), и я пытаюсь добавить две модели к представлениям. Он отлично показывает, используя editorFor(). Теперь проблема заключается в том, что некоторая часть не передает информацию контроллеру.

В этом случае каждое упражнение получило некоторые ответы. Это мое упражнение модель:

Table("Exercise")] 
public class ExerciseModel 
{ 

    [Key] 
    public int ExerciseId { get; set; } 

    [Required] 
    public string Question { get; set; } 

    [Required] 
    public List<AnswerModel> Answers { get; set; } 

И этот answermodel:

[Table("Answer")] 
public class AnswerModel 
{ 
    [Key] 
    public int AnswerId { get; set; } 

    [Required] 
    public string Answer { get; set; } 
} 

мнение существует из двух частей, физическая часть (рабочих один) и ответ часть. Я хочу добавить больше ответов в список в упражнении. Я пробовал разные способы. Шаблоны редакторов, частичные виды и т. Д.

Это вид: Вы можете создать новый вопрос и добавить ответы в дороге, используя JQuery. То, что я хочу создать, - это то, что я могу публиковать ответы в этом списке в exerciseisemodel.

@using (Html.BeginForm("CreateQuestion", "Admin", FormMethod.Post)) 
{ 
@Html.ValidationSummary(true) 

//will be changed 
@Html.Partial("_PartialCreateExercise") 

//this shows the answers form 
<div style="display: none;" id="new"> 
    <div class="editor-field"> 
      @Html.EditorFor(m => m.Answers); 
    </div> 
</div> 



<p> 
    <input name="command" type="button" id="add" value="add new answers" /> 
</p> 
<p> 
    <input name="command" type="submit" value="Create" /> 
</p> 
} 

Это работает, но когда я отправить страницу на список в exercisemodel (типа AnswerModel) остается пустым. И, наконец, шаблон редактора ответов:

@model Academy.Models.AnswerModel 
@{ 
Layout = null; 
} 


<h2>Answer</h2> 
<p> 
    @Html.LabelFor(model => model.Answer) 
    @Html.EditorFor(model => model.Answer) 
</p> 



The jQuery: 
$(document).ready(function() { 
    $("#add").click(function() { 
     $('#add').after($("#new").html()); 
     $('#new').css("Display", "block"); 
    }); 
}); 

Это не делает много и пытался много там, так что он становится грязным. Но при использовании режима отладки List in ExerciseModel пуст, а также AnswerModel.

Итак, проблема заключается в том, что при отправке формы список в упражненииModel остается пустым. Я не могу добираться до List в упражнении по какой-то причине с помощью шаблона редактора. (контроллер не включен, потому что он не делает много сейчас, и Список всегда пуст)

Это удерживало меня в напряжении в течение недели, надеюсь, кто-то может мне помочь?

+0

Можете ли вы разместить свой контроллер (ы)? –

+0

Я добавил контроллер-метод, который должен выполнять обработку. Это немного грязно, извините. Пробовал много. Но при использовании отладчика List в ExerciseModel пуст, как и сам AnswerModel. Как я уже сказал, на прошлой неделе я попробовал LOT. –

ответ

1

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

Что нужно соблюдать, это соглашение об именах полей ввода. Фил Хаак изображен в his blog post этой конвенции.

В основном есть 2 подхода к динамическому добавлению нового элемента (при #btnadd нажатия):

  1. Отправить вызов AJAX для действия контроллера, который будет возвращать частичный вид, содержащий ан пустого шаблона. Соглашение об именовании должно быть вновь соблюдено. Трудность здесь связана с индексом. Поскольку соглашение об именах позволяет использовать несекретные индексы (еще раз читайте блог Phil Haack), проще всего использовать гиды в качестве индексов. Стивен Сандерсон проиллюстрировал эту концепцию в his blog post и даже показал специальный помощник Html.BeginCollectionItem, который делает именно это.

  2. Сделайте это исключительно на стороне клиента. Например, вы можете использовать фреймворк, такой как knockoutjs. Стивен Сандерсон снова продемонстрировал эту концепцию в his blog post.

Так что, в основном, вам решать, какой подход вы предпочитаете. Но независимо от того, какой подход вы выберете при отправке формы, если вы не соблюдали соглашение об именах полей ввода «Ответы», все, что вы получите в действии вашего контроллера, равно null.

+0

Спасибо, прочитаю его прямо сейчас. Также добавлена ​​моя простая функция JQuery. –

+0

Да, проблема, похоже, в вашем коде jQuery, где вы никогда не увеличиваете индексы в именах полей ввода. –

+0

Я понимаю, что вы говорите, но я не знаю, как это сделать. Могли бы вы дать мне руку? –

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