【问题标题】:GET and POST issues in ASP.NET CORE MVC C#ASP.NET CORE MVC C# 中的 GET 和 POST 问题
【发布时间】:2021-05-15 20:47:25
【问题描述】:

我的 HttpPost 编辑任务没有给我我的 EventMembers 列表。我为我的编辑任务在 GET 上放了一个手表,它读取我的 EventMembers 就好了。但是当我得到我的 POST 编辑时,我的 EventMembers 仅在我的监视窗口中显示 System.Collections.Generic.List`1[System.String] 以及我的视图中的输入框。发生了什么事?

型号:

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; }

    }

控制器:

// 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);
        }

查看:

@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");}
}

【问题讨论】:

  • EventMembers 是输入字符串而不是集合,这个字段的值是多少?
  • 您不能像在视图中给出的那样用单个文本框表示可枚举属性:输入 asp-for="EventMembers"。它应该像 asp-for="EventMembers[0]"
  • 太好了,说得通。现在我如何确定用户页面上有足够的文本框?每个 Event 会有不同数量的 EventMembers。

标签: c# asp.net-core-mvc


【解决方案1】:

由于您的 EventMembers 模型属性是一个 Enumerable 列表,表示该属性的 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>

最佳做法是在循环内生成控件。

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

【讨论】:

  • 您是否使用 foreach 循环在视图页面内循环类似的内容?
  • @elementmg 修改了我的答案,你可以使用 for 循环
  • 好的,谢谢!我今天学到了新东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2018-08-11
相关资源
最近更新 更多