Создал динамический список детей во время создания родителя в asp.net MVC3 EF4.1 - PullRequest
2 голосов
/ 25 августа 2011

Моя цель - разрешить пользователю добавлять цели (дочерние элементы) в обзор (родительский) при создании и / или редактировании обзора. У меня это в основном работает, поэтому я ищу ответы на два вопроса 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

1 Ответ

0 голосов
/ 13 сентября 2011

Я думаю, что вы могли бы использовать решение Стивена Сандерсона, которое вы можете найти здесь: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

его помощник поможет вам добавить новые данные для каждой цели, которую вы хотите добавить в форму. Я использую его здесь и там в моих веб-приложениях без каких-либо проблем. Я могу добавлять / удалять элементы в режиме создания или изменения.

...