Я использую MVC в веб-приложении .NET Core 2.У меня есть расписание организации, которое содержит расписание встреч между советником и учеником (оба являются субъектами).В моей Редактировать ViewModel для моего расписания у меня есть свойство для советника и ученика - я использую это только для отображения - для отображения их имен и другой информации в редактируемом расписании.Я использую CounselorId и StudentId в самом моем объекте Schedule.В моем действии HttpGet для редактирования я просто отлично заполняю свою ViewModel советником и учеником.Однако в действии HttpPost «Правка» я передаю свой ViewModel и вижу, что мой советник и ученик оба имеют значение NULL.Затем я получаю сообщение об ошибке при попытке обновить мой объект Schedule.Вот сообщение:
Связь между типами сущностей 'Студент' и 'Расписание' была разорвана, но внешний ключ для этой связи не может быть установлен равным нулю.Если зависимая сущность должна быть удалена, то настройте отношение для использования каскадного удаления.
Я обнаружил, что если я нажму на базу данных, чтобы заполнить мою модель. Советник и модель. Студент в моем действии редактирования HttpPost перед вызовом обновлениячто это работает.Я хочу знать, в чем здесь дело, используя лучшие практики.Спасибо за вашу помощь.
Вот мой взгляд:
@using CounselorSchedule.ViewModels
@model ScheduleEditViewModel
@{
ViewData["Title"] = "Edit Schedule";
}
<link href="~/css/bootstrap-datepicker.css" rel="stylesheet" />
@section Scripts{
<script src="~/scripts/boostrap-datepicker.min.js"></script>
<script>
$(document).ready(function () {
$(".datepicker").datepicker({ format: 'mm/dd/yyyy', autoclose: true, todayBtn: 'linked' })
});
</script>
}
<div class="row top-buffer">
<div class="col-sm-12">
<h2>Edit Schedule</h2>
</div>
</div>
<form asp-action="Edit">
<div class="row top-buffer">
<div class="col-sm-12">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<div class="row">
<div class="col-sm-4">
<h4>Schedule</h4>
</div>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="form-group">
<div class="col-sm-6">
<div class="editor-label">
<input type="hidden" asp-for="ScheduleId" />
<input type="hidden" asp-for="CounselorId" />
<input type="hidden" asp-for="StudentId" />
<label asp-for="Counselor" class="control-label"></label>
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.Counselor.CounselorFirstName) @Html.DisplayFor(model => model.Counselor.CounselorLastName)
</div>
</div>
<div class="col-sm-6">
<div class="editor-label">
<label asp-for="Student" class="control-label"></label>
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.Student.StudentFirstName) @Html.DisplayFor(model => model.Student.StudentLastName)
</div>
</div>
</div>
</div>
<div class="divide20"></div>
<div class="row">
<div class="form-group">
<div class="col-sm-4">
<div class="editor-label">
<label asp-for="ScheduleDate" class="control-label"></label>
</div>
<div class="editor-field">
<input asp-for="ScheduleDate" class="form-control datepicker" type="text" />
<span asp-validation-for="ScheduleDate" class="text-danger"></span>
</div>
</div>
<div class="col-sm-4">
<div class="editor-label">
<label asp-for="ScheduleTimeId" class="control-label"></label>
</div>
<div class="editor-field">
<select asp-for="ScheduleTimeId" class="form-control"
asp-items="@Model.ScheduleTimeList">
<option value="-1" selected>-</option>
</select>
<span asp-validation-for="ScheduleTimeId" class="text-danger"></span>
</div>
</div>
</div>
</div>
</div>
<div class="panel-footer">
<div class="row">
<div class="col-sm-offset-6 col-sm-3">
<a class="btn btn-default btn-block"
asp-action="Details" asp-route-id="@Model.ScheduleId">Cancel</a>
</div>
<div class="col-sm-3">
<input type="submit" value="Update Case" class="btn btn-primary btn-block" />
</div>
</div>
</div>
</div>
</div>
</div>
</form>
Вот мой код контроллера:
[HttpPost]
public IActionResult Edit(ScheduleEditViewModel model)
{
var schedule = _repository.GetScheduleDetails(model.ScheduleId);
if (ModelState.IsValid)
{
#region Allow reset of SelectList to "-"
//If "-" was selected then set to NULL in database
var scheduleTimeId = Convert.ToInt32(model.ScheduleTimeId);
if (scheduleTimeId == -1)
model.ScheduleTimeId = null;
#endregion
Mapper.Map(model, schedule);
_repository.PutSchedule(schedule);
return RedirectToAction("Details", "Schedule", new { @id = schedule.ScheduleId });
}
else
{
model = PopulateScheduleEditViewModel(model, schedule);
return View(model);
}
}
Вот мой Edit View Model:
public class ScheduleEditViewModel
{
public int ScheduleId { get; set; }
public int CounselorId { get; set; }
public int StudentId { get; set; }
[Display(Name = "Counselor")]
public Counselor Counselor { get; set; }
[Display(Name = "Student")]
public Student Student { get; set; }
[Display(Name = "Schedule Date")]
[DataType(DataType.Date)]
public DateTime? ScheduleDate { get; set; }
[Display(Name = "Schedule Time")]
public int? ScheduleTimeId { get; set; }
public SelectList ScheduleTimeList { get; set; }
}