Моя цель - разрешить пользователю добавлять цели (дочерние элементы) в обзор (родительский) при создании и / или редактировании обзора. У меня это в основном работает, поэтому я ищу ответы на два вопроса A. Как я могу сделать это лучше, чище, и B. Когда я редактирую родителя, почему он не спасет вновь добавленных детей. Я думаю, что ответ А сделает В устаревшим. Спасибо за помощь.
Вот некоторые основные моменты кода и мое рабочее решение, которое вы можете скачать ниже.
public ActionResult Create()
{
var review = new Review();
review.Goals.Add(new Goal());
return View(review);
}
//
// GET: /Reviews/Edit/5
public ActionResult Edit(int id)
{
return View(reviewRepository.AllIncluding(review => review.Goals).Single(review => review.ReviewID == id));
}
Это довольно просто, здесь нет ничего необычного.
вот моя форма createoredit с jquery для вызова ajax
<div class="editor-label">
@Html.LabelFor(model => model.ReviewName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ReviewName)
@Html.ValidationMessageFor(model => model.ReviewName)
<div id="goals">
@Html.EditorFor(model => model.Goals)
</div>
@Html.ActionLink("Add another...", "NewGoal", null, new { id = "addItem" })
<script type="text/javascript">
$("#addItem").click(function () {
$.ajax({
url: this.href,
data: "index=" + getLastIndex() + "&parentID=" + getParentID(),
cache: false,
success: function (html) {
alert(html);
$("#goals").append(html);
}
});
return false;
});
function getParentID() {
var val = $('#ReviewID').val();
if (val == null)
return 0;
else
return val;
}
function getLastIndex() {
return $('input[name=Goals.Index]:last').val();
}
</script>
ajax-запрос получает частичное представление
public PartialViewResult NewGoal(int? index, int? parentID)
{
ViewBag.Index = index + 1;
ViewBag.ParentID = parentID;
return PartialView("../Shared/NewGoal", new Goal());
}
и вот как выглядит частичное. В моем проекте вы увидите, что у начала html-помощника есть верный индекс, в котором на данный момент жестко заданы названия моделей, так как это просто проект myscratch, и я уверен, что есть лучший способ сделать это.
<input name="Goals.Index" value="0" type="hidden">
<input id="Goals_0__GoalID" name="Goals[0].GoalID" value="0" type="hidden" data-val-required="The GoalID field is required." data-val-number="The field GoalID must be a number." data-val="true">
<input id="Goals_0__ReviewID" name="Goals[0].ReviewID" value="0" type="hidden" data-val-required="The ReviewID field is required." data-val-number="The field ReviewID must be a number." data-val="true">
<div class="editor-label">
<label for="Goals_0__GoalName">GoalName</label>
</div>
<div class="editor-field">
<input id="Goals_0__GoalName" class="text-box single-line" name="Goals[0].GoalName" value="" type="text">
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Goals[0].GoalName"></span>
</div>
Решение Visual Studio http://dl.dropbox.com/u/29534952/RelationScratch.zip