简体   繁体   English

ASP.NET CORE MVC C# 中的 GET 和 POST 问题

[英]GET and POST issues in ASP.NET CORE MVC C#

My HttpPost Edit task is not giving me my list of EventMembers.我的 HttpPost 编辑任务没有给我我的 EventMembers 列表。 I put a watch on the GET for my Edit task and it reads my EventMembers just fine.我为我的编辑任务在 GET 上放了一个手表,它读取我的 EventMembers 就好了。 but when i get my POST Edit my EventMembers only shows System.Collections.Generic.List`1[System.String] in my watch window, as well as my input box in my view.但是当我收到我的 POST 编辑时,我的 EventMembers 只在我的手表 window 中显示 System.Collections.Generic.List`1[System.String] 以及我的输入框。 Whats happening?发生了什么?

Model: Model:

public class Event
    {
        [Required]
        public int EventId { get; set; }

        [ForeignKey("UserId")]
        public virtual SchedulerUser SchedulerUser { get; set; }

        [MaxLength(50)]
        public string EventCreator { get; set; }

        public List<string> EventMembers { get; set; }

        [Required]
        [MaxLength(100)]
        public string Subject { get; set; }

        [MaxLength(400)]
        public string Description { get; set; }

        [Required]
        public DateTime StartTime { get; set; }

        public DateTime? EndTime { get; set; }

        [Required]
        public bool IsFullDay { get; set; }

        [Required]
        public bool AcceptOrDecline { get; set; }

    }

Controller: Controller:

// GET: Events/Edit/5
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var @event = await _context.Events.FindAsync(id);
            if (@event == null)
            {
                return NotFound();
            }
            return View(@event);
        }

// POST: Events/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("EventId,UserId,EventCreator,EventMembers,Subject,Description,StartTime,EndTime,IsFullDay,AcceptOrDecline")] Event @event)
        {
            if (id != @event.EventId)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {
                try
                {
                    @event.SchedulerUser = await _userManager.GetUserAsync(HttpContext.User);
                  
                    _context.Update(@event);

                    if (@event.AcceptOrDecline == false)
                    {
                        _context.Remove(@event);
                    }
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!EventExists(@event.EventId))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(@event);
        }

View:看法:

@model Scheduler.Models.Event

@{
    ViewData["Title"] = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Edit</h1>

<h4>Event</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Edit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="EventId" />
            <div class="form-group">
                <label asp-for="Subject" class="control-label"></label>
                <input asp-for="Subject" class="form-control" />
                <span asp-validation-for="Subject" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Description" class="control-label"></label>
                <input asp-for="Description" class="form-control" />
                <span asp-validation-for="Description" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="EventMembers" class="control-label"></label>
                <input asp-for="EventMembers" class="form-control" />
                <span asp-validation-for="EventMembers" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="StartTime" class="control-label">Start Time</label>
                <input asp-for="StartTime" class="form-control" />
                <span asp-validation-for="StartTime" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="EndTime" class="control-label">End Time</label>
                <input asp-for="EndTime" class="form-control" />
                <span asp-validation-for="EndTime" class="text-danger"></span>
            </div>
            <div class="form-group form-check">
                <label class="form-check-label">
                    <input class="form-check-input" asp-for="IsFullDay" /> All Day
                </label>
            </div>
            <div class="form-group form-check">
                <label class="form-check-label">
                    <input class="form-check-input" asp-for="AcceptOrDecline" /> Accepted
                </label>
                <p style="color:red; font-weight:bold;">Uncheck this to decline invitation. Event will be removed from your schedule.</p>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Since your EventMembers model property is an Enumerable list, the Html control which represents the property should be indexed.由于您的EventMembers model 属性是一个可枚举列表,因此应该对代表该属性的 Html 控件进行索引。

<div class="form-group">
   <label asp-for="EventMembers[0]" class="control-label"></label>
   <input asp-for="EventMembers[0]" class="form-control" />
   <span asp-validation-for="EventMembers[0]" class="text-danger"></span>
</div>
<div class="form-group">
   ...
   <input asp-for="EventMembers[1]" class="form-control" />
   ...
</div>

The best practice is to generate the control inside a loop.最佳实践是在循环内生成控件。

@for (int i = 0; i < Model.EventMembers.Count; i++)
{
    <div class="form-group">
      ...
      <input asp-for="EventMembers[i]" class="form-control" />
      ...
    </div>
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM