.NET Core MVC поддерживает пользовательские объекты в действии - PullRequest
0 голосов
/ 15 мая 2018

Я использую 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...