Заполнение данных из последней строки в форме при создании новой записи - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть форма для создания новых записей данных для комментариев. Создание абсолютно новых записей работает отлично. Однако, когда я уже создал одну запись для своей сущности, я хочу заполнить данные из последней записи в моей форме.

Я попытался изменить действие OnGet, включив в него данные из последней записи. Я скопировал код OnGet из представления «Правка» в представление «Создать». Однако, если я это сделаю, страница Создать больше не будет отображаться.

У меня есть следующая модель:

    public class ProjectComment
    {
        public int Id { get; set; }

        public int? ProjectId { get; set; }
        public Project Project { get; set; }

        public int RAGStatusId { get; set; }
        public RAGStatus RAGStatus { get; set; }

        public string StatusComment { get; set; }
        public string EscalationComment { get; set; }
        public string GeneralComment { get; set; }
        public double? EOQ { get; set; }
        public DateTime LastUpdateDate { get; set; }
        public ProjectComment ()
        {
            this.LastUpdateDate = DateTime.UtcNow;
        }

Форма создания Create.cshtml:

@page
@model SimpleProjectReporting.Pages.ClientDetails.CreateModel

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>ProjectComment</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="ProjectComment.ProjectId" class="control-label"></label>
                <select asp-for="ProjectComment.ProjectId" class="form-control" asp-items="ViewBag.ProjectId"><option value="" default="" selected="">-- Select --</option></select>
            </div>
            <div class="form-group">
                <label asp-for="ProjectComment.RAGStatusId" class="control-label"></label>
                <select asp-for="ProjectComment.RAGStatusId" class="form-control" asp-items="ViewBag.RAGStatusId"><option value="" default="" selected="">-- Select --</option></select>
            </div>
            <div class="form-group">
                <label asp-for="ProjectComment.StatusComment" class="control-label"></label>
                <input asp-for="ProjectComment.StatusComment" class="form-control" />
                <span asp-validation-for="ProjectComment.StatusComment" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectComment.EOQ" class="control-label"></label>
                <input asp-for="ProjectComment.EOQ" class="form-control" />
                <span asp-validation-for="ProjectComment.EOQ" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

Исходное действие Create.cshtml.cs:

        [BindProperty]
        public ProjectComment ProjectComment { get; set; }

        public IActionResult OnGet()
        {
            ViewData["ProjectId"] = new SelectList(_context.Project.Where(a => a.IsArchived == false), "Id", "ProjectName");
            ViewData["RAGStatusId"] = new SelectList(_context.RAGStatus.Where(a => a.IsActive == true), "Id", "RAGStatusName");
            return Page();
        }

        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see https://aka.ms/RazorPagesCRUD.
        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.ProjectComment.Add(ProjectComment);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        }

Измененное действие Create.cshtml.cs OnGet:

        public async Task<IActionResult> OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            ProjectComment = await _context.ProjectComment
                .Include(p => p.Project)
                .Include(p => p.RAGStatus).FirstOrDefaultAsync(m => m.Id == id);

            if (ProjectComment == null)
            {
                return NotFound();
            }

При изменении действия так, как я это сделал,страница больше не отображается (ошибка 404). Я хотел бы заполнить форму создания с данными из последней записи в базе данных. Если нет комментариев, страница создания будет заполнять только имя проекта.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Вы пытаетесь достичь последней записи вашей таблицы ProjectComment. Существует несколько способов найти последнюю запись в вашей таблице данных. Но давайте сделаем это просто.

У вас есть целочисленный столбец идентификаторов, который равен Автоинкремент . Таким образом, вы можете просто использовать приведенные ниже методы для доступа к последним созданным данным вашей таблицы.

В вашем OnGetAsync() методе:

//maxId will be the maximum value of "Id" columns. Which means that the maximum value is the last recorded value.
int maxId = _context.ProjectComment.Max(i => i.Id);

//And this line will bring you the last recorded "ProjectComment" object.
var projectComment = _context.ProjectComment.Find(maxId); 

//You can assign it to your above 'ProjectComment' property if you want to.. 
ProjectComment = projectComment 

Теперь, так как вы нашли последнюю записанную записьданные в вашей базе данных, вы можете использовать этот объект.

0 голосов
/ 03 ноября 2019

Я полагаю, вы не отправляете параметр "id" в свое сообщение.

Не могли бы вы добавить эту строку под тегом form:

<form method="post">
<input type="hidden" id="ProjectComment.Id" name="id" value="ProjectComment.Id" />
...