ASP.NET MVC Добавить дочерние записи динамически

Используя Entity Data Framework, у меня определена модель под названием Клиент , которая просто содержит идентификатор и имя. Затем у меня есть связь с другой моделью под названием Назначение , содержащей идентификатор и дату.

Для формы я хочу разрешить пользователям создавать нового клиента и в той же форме добавлять встречи (до клиент создан). У меня он работает частично (добавление одной встречи).

В контроллере:

[HttpPost]
public ActionResult Create(Client client)
{
    var appointment = new Appointment();
    UpdateModel(appointment);
    client.Appointments.Add(appointment);
    db.AddToClients(client);
    db.SaveChanges();
    return RedirectToAction("Index");
}

В представлении:

<div class="editor-label">
    <%= Html.LabelFor(model => model.Name) %>
</div>
<div class="editor-field">
    <%= Html.TextBoxFor(model => model.Name) %>
    <%= Html.ValidationMessageFor(model => model.Name) %>
</div>
<% Html.RenderPartial("Appointment", new Appointment()); %>

«Частичное» представление:

<div class="editor-label">
    <%= Html.LabelFor(model => model.AppointmentDate) %>
</div>
<div class="editor-field">
    <%= Html.TextBoxFor(model => model.AppointmentDate) %>
    <%= Html.ValidationMessageFor(model => model.AppointmentDate) %>
</div>

Однако это не идеально по нескольким причинам:

  1. Только можно добавить одну встречу
  2. Проблемы возникнут, если возникнут конфликты имен (например, поле под названием Комментарии в таблице Client и Appointment ), поскольку в именах полей не делается префиксов, что также предотвращает добавление более одной встречи в качестве хорошо

Что я могу сделать, чтобы разрешить добавление нескольких встреч, например, используя кнопку, чтобы отобразить частичное представление (возможно, с использованием AJAX) на странице при щелчке по «новой встрече», чтобы разрешить как можно больше встреч? Я также хотел бы, чтобы это было общее представление, которое можно было бы использовать как для создания и редактирования записей, так и для добавления / удаления встреч в одной и той же форме.

Обновление
Некоторый прогресс с использованием ViewModel:

public class ClientViewModel
{
    public Client Client { get; set; }
    public List<Appointment> Appointments { get; set; }
}

Контроллер :

public ActionResult Create()
{
    Client c = new Client();
    List<Appointment> appointments = new List<Appointment>();
    appointments.Add(new Appointment() { AppointmentDate = DateTime.Now });
    appointments.Add(new Appointment() { AppointmentDate = DateTime.Now.AddMonths(1) });

    var model = new ClientViewModel
    {
        Client = c,
        Appointments = appointments
    };
    return View(model);
}

[HttpPost]
public ActionResult Create(ClientViewModel m)
{
    try
    {
        foreach (var appointment in m.Appointments)
        {
            m.Client.Appointments.Add(appointment);
        }
        db.AddToClients(m.Client);

        db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

Просмотр (для встреч, не работает с циклом foreach , поскольку каждое из встреч имеет префикс Appointment_ , а не Appointment [0] _ ):

<%= Html.EditorFor(model => Model.Client) %>
<% for (int i = 0; i < Model.Appointments.Count(); i++) { %>
    <%= Html.EditorFor(model => Model.Appointments[i])%>
<% } %>

Это нормально для создания встреч для нового клиента, но как насчет их редактирования, а также добавление новых встреч без отправки формы? Для добавления ссылка, которая показывает новую форму встречи под существующей, с другой ссылкой для удаления (скрыть из поля зрения и установить значение скрытого поля).

Обновление 2
Получилось, для добавления встреч при первом создание клиента. Однако я не уверен, как обновить существующие встречи (не просто удаляя их все и не добавляя снова).

В контроллере:

[HttpPost]
public PartialViewResult AddAppointment(Appointment appointment, int index)
{
    List<Appointment> appointments = new List<Appointment>();
    for (int i = 0; i < index; i++)
    {
        appointments.Add(null);
    }
    appointments.Add(new Appointment() { AppointmentDate = DateTime.Now });
    ViewData["index"] = index;
    var model = new ClientViewModel
    {
        Appointments = appointments
    };
    return PartialView("Appointment", model);
}

Просмотр:

<%= Html.EditorFor(model => Model.Client) %>
<div id="appointments">
<% for (int i = 0; i < Model.Appointments.Count(); i++) { %>
    <%= Html.EditorFor(model => Model.Appointments[i]) %>
<% } %>
</div>
<a href="javascript:;" id="addappointment">Add Appointment</a>
<script type="text/javascript">
    var appIndex = <%= Model.Appointments.Count() %>;
    $("#addappointment").click(function () {
        $.post(
            "/Client/AddAppointment",
            {"index" : appIndex}, 
            function (result) {
                $("#appointments").append(result);
                // increase index by 1
                appIndex++;
            }
        );
});
9
задан SamWM 23 November 2010 в 15:01
поделиться