Asp.net MVC с Entity, используя jquery для передачи данных в List. Не работает

Редактировать 3 / Финал

Это полностью рабочий пример использования шаблонов.NET MVC, Jquery и редактора. https://www.dropbox.com/s/t4yxbhkuowyd7va/exerciseTest.rar

Редактировать 2

Это наконец работает! Благодаря ответу ниже. Похоже, что мне нужно было изменить частичную строку NewAnswerRow:

<input type='text' id='Answers_@(Model.AnswerId)__Answer'   name='Answers[@Model.AnswerId].Answer'/>

Спасибо!

Изменить 1:

Я следовал этому руководству: http://www.techiesweb.net/asp-net-mvc3-dynamically-added-form-fields-model-binding/

Самое смешное, что когда я использую его источник, он работает так, как должен. Но это почти точно так же.

Оригинальный пост

Прежде всего, спасибо, что прочитали это сообщение и готовы помочь. Я изумлен. Позвольте мне попытаться объяснить мою ситуацию. Я пытаюсь создать новое упражнение, в котором есть список с ответами. Эти ответы создаются на лету с помощью Jquery. Я читаю эти ответы с EditorTemplates. Все работает, за исключением того, что когда я создаю новые поля "Ответить" и нажимаю "Опубликовать", мой контроллер не может видеть никаких данных (ответов). Странная вещь Когда я использую аннотации данных, например, [обязательно], например, в свойстве ответа. Я перенаправлен в указатель. Когда я попробую это снова, моя модель больше не пуста.

В общем, мой вопрос: как мне получить эти ответы в моем списке?

Я создал для вас новый проект, чтобы вы были более четкими и конкретными.

У меня 2 модели,

  • Упражнение

  • ответы

Класс ExerciseModel

[Table("Exercise")]
public class ExerciseModel
{

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


    public string Question { get; set; }


    public IList<AnswerModel> Answers { get; set; }
}

Это в основном простой класс. Как вы, ребята, можете видеть. Есть список с ответами.

AnswerModel

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

    public string Answer { get; set; }
 }

Простой класс AnswerModel с идентификатором и ответом.

Мой контроллер

public class ExerciseController : Controller
{
    private readonly DataContext db = new DataContext();
    //
    // GET: /Exercise/
    public ActionResult Index()
    {
        var exercise = new ExerciseModel();
        exercise.Answers = GetAnswers();

        return View(exercise);
    }


    [HttpPost]
    public ActionResult Index(ExerciseModel exercisemodel)
    {
        //need to implement interaction with database (not yet) testing phase.
        return View("PostedData", exercisemodel);
    }


    public ActionResult NewAnswersRow(int id)
    {
        var answers = new AnswerModel { AnswerId = id };
        return View("partial/NewAnswersRow", answers);
    }


    private List<AnswerModel> GetAnswers()
    {
        var answerslist = new List<AnswerModel>();
        answerslist.Add(new AnswerModel { AnswerId = 1, Answer = "This is a hardcoded answer"}); //normally db.Answers (for testing purposes)
        return answerslist;
    }

}

Мой индексный вид

@model exerciseTest.Models.ExerciseModel
@using (Html.BeginForm())
{

    <div class="divAnswers">
        <div  id="container">
            <div class="editor-label">
                @Html.LabelFor(model => model.Question)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Question)
                @Html.ValidationMessageFor(model => model.Question)
            </div>
            @Html.EditorFor(m => m.Answers)

        </div>
        <input type="button" id="btnAdd" value="Add New Item" />
    </div>
    <p>
        <input type="submit" value="Save" />
    </p>
}


    <script>

$(function () {
    $("#btnAdd").click(function (e) {
        var itemIndex = $("#container input.iHidden").length;
        console.debug("itemIndex : "+itemIndex);
        e.preventDefault();
        $.get("@Url.Action("NewAnswersRow", "Exercise")/"+itemIndex,function(data){
            $("#container").append(data);
        });           
    });
});

</script>

Мой редактор шаблонов AnswerModel

@model exerciseTest.Models.AnswerModel
@{
    Layout = null;
}
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<tr> 
 <td>
  @Html.HiddenFor(x => x.AnswerId, new { @class="iHidden" })
 @Html.TextBoxFor(x => x.Answer) </td>
</tr>

Мой NewAnswersRow.cshtml для создания новых строк на лету с помощью Jquery (см. Индекс для части кода)

@model exerciseTest.Models.AnswerModel
@{    Layout = null; }
<tr> 
 <td>
  <input type="hidden" id="Answers_@(Model.AnswerId)__Id" class="iHidden"  name='Answers[@Model.AnswerId].Id' />
  <input type='text' id='Answers_@(Model.AnswerId)__AnswersText'   name='Answers[@Model.AnswerId].AnswersText'/>
 </td>
</tr>

И мой вид "опубликованных данных" для тестирования

@model exerciseTest.Models.ExerciseModel
<h3>Posted data is </h3>

@foreach (var item in Model.Answers)
{
   <p>@item.Answer</p>
}

Я пытаюсь заставить эту вещь работать. Я должен сказать, что в течение 5 лет я никогда не просил кое-что здесь, на Stackru, потому что я мог найти ответы. Но на этот раз мне нужна твоя помощь.

Спасибо!

1 ответ

Решение

У вас есть ошибка в вашем NewAnswersRow partial view, Name а также Id одинаковы в вашем html, однако это имя передается в форме сообщения. Если вы посмотрите на что MVC делает, имя атрибута текстового поля ответа Answers[x].Answer, в то время как Id является Answers[x].AnswerText,

Так что поменяй name='Answers[@Model.AnswerId].AnswerText' в name='Answers[@Model.AnswerId].Answer' так что соответствует MVC ожидает. Работал на меня!

Другие вопросы по тегам