Получение идентификатора родительской модели при добавлении дочерней записи в MVC 3 с бритвой? - PullRequest
0 голосов
/ 07 февраля 2012

Таким образом, в приложении со структурой реляционных баз данных «один ко многим» вы, конечно, должны иметь возможность добавлять несколько дочерних записей для родителя ... Итак, допустим, что у вас есть пользователь, и у пользователя может быть один профиль, но каждый профиль может иметь несколько проектов, и, конечно, проекты состоят из нескольких дочерних таблиц, таких как, например, ProjectCodeSamples, являясь одной из них ...

Очевидно, что для добавления нового ProjectCodeSample требуется ProjectID, которому он принадлежит (в качестве внешнего ключа) ... Итак, в представлении AddCodeSample как получить это значение, значение ProjectID, чтобы вы можете поместить это в скрытое поле и передать его?

Вот модель ProjectCodeSample:

namespace ProDevPortMVC3
{
    using System;
    using System.Collections.Generic;

    public partial class ProjectCodeSample
    {
        public int ProjectCodeSampleID { get; set; }
        public int ProjectID { get; set; }
        public string ProjectCodeSampleContent { get; set; }
        public string ProjectCodeSampleDescription { get; set; }

        public virtual Project Project { get; set; }
    }
}

Вот два моих метода действий контроллера для AddCodeSample:

//
// GET: /Project/AddCodeSample

public ActionResult AddCodeSample()
{
    return View();
}

//
// POST: /Project/AddCodeSample

[HttpPost]
public ActionResult AddCodeSample(ProjectCodeSample projectcodesample)
{
    projectcodesample.ProjectCodeSampleContent = projectcodesample.ProjectCodeSampleContent.TrimStart();

    if (ModelState.IsValid)
    {
        db.ProjectCodeSamples.Add(projectcodesample);
        db.SaveChanges();
        return RedirectToAction("Details/" + projectcodesample.ProjectID);
    }
    else
    {
        return View(projectcodesample);
    }
}

Вот мой AddCodeSample View:

@model ProDevPortMVC3.ProjectCodeSample

@{
    ViewBag.Title = "Add Code Sample";
}

<style type="text/css">
    .editor-label { width: 200px; }
    .editor-field { width: 700px; }
    .submit-button-row { width: 900px; }
    .bottom-nav { width: 900px; }
</style>

<h2>Add Code Sample</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset style="float: left; width: 900px;">
        <legend>Project Code Sample</legend>
        @Html.HiddenFor(model => model.ProjectID)
        <div class="display-editor-label-field-row">
            <div class="editor-label">
                @Html.LabelFor(model => model.ProjectCodeSampleDescription, "Code Sample Description")
            </div>
            <div class="editor-field">
                @Html.TextAreaFor(model => model.ProjectCodeSampleDescription, 4, 85, null)
                @Html.ValidationMessageFor(model => model.ProjectCodeSampleDescription)
            </div>
        </div>
        <br />
        <div class="display-editor-label-field-row">
            <div class="editor-label">
                @Html.LabelFor(model => model.ProjectCodeSampleContent, "Code Sample")
            </div>
            <div class="editor-field">
                @Html.TextAreaFor(model => model.ProjectCodeSampleContent, 15, 85, null)
                @Html.ValidationMessageFor(model => model.ProjectCodeSampleContent)
            </div>
        </div>
        <br />
        <div class="display-editor-label-field-row">
            <div class="submit-button-row">
                <input type="submit" value="Save" />
            </div>
        </div>
        <br />
        <div class="bottom-nav">
            @Html.ActionLink("Cancel", "Details", new { id = ViewContext.RouteData.Values["ID"] })
        </div>
    </fieldset>
}

Так что, очевидно, это не будет работать, потому что "@ Html.HiddenFor (model => model.ProjectID)" будет пустым ... Так что я делаю не так, как вы получаете Parent ID, чтобы вы могли сделать Дочерние записи?

1 Ответ

1 голос
/ 07 февраля 2012

Вы можете передать идентификатор с предыдущей страницы на эту страницу, используя строку запроса в вашей ссылке:

public ActionResult AddCodeSample(int id)
{
    var m = new ProjectCodeSample();
    m.ProjectID = id;
    return View(m);
}

Таким образом, на вашей «родительской» странице проекта может быть такая ссылка:

<a href="/addcodesample?id=2">Add Code Sample</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...