Используя 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>
Однако это не идеально по нескольким причинам:
Комментарии
в таблице 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++;
}
);
});