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
ожидает. Работал на меня!