简体   繁体   English

Asp.Net Core 2绑定的对象为null

[英]Asp.Net Core 2 bound object is null

When I submit my form, ModelValidation.IsValid is true, but the object I have used [BindProperty] on is null. 当我提交表单时,ModelValidation.IsValid为true,但是我使用[BindProperty]的对象为null。

PageModel PageModel

I have the [BindProperty] tag on the public Group Group {get; private set} 我在public Group Group {get; private set}上具有[BindProperty]标记public Group Group {get; private set} public Group Group {get; private set} property. public Group Group {get; private set}属性。

In the OnGetAsync(int? Id) method I look up the Group with .FindAsync(Id) and populate the form. OnGetAsync(int? Id)方法中,我使用.FindAsync(Id)查找Group并填充表单。 That works fine :) 那很好:)

My understanding is that the OnPostAsync() should populate the Group object automatically as a result of the BindProperty annotation. 我的理解是,由于OnPostAsync()OnPostAsync()应该自动填充Group对象。 However, once I post the ModelState is Valid, but the Group object is null. 但是,一旦我发布ModelState是有效的,但Group对象为null。 How do I fix this? 我该如何解决?

using xxx.ReportGroups.Data;
using xxx.ReportGroups.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace xxx.ReportGroups.Pages
{

    public class GroupEditModel : PageModel
    {
        private readonly ApplicationDbContext _db;

        public GroupEditModel(ApplicationDbContext db)
        {
            _db = db;
        }

        [BindProperty]
        public string ErrorMessage { get; private set; }

        [BindProperty]
        public Group Group { get; private set; }

        public IList<Group> ParentGroups { get; private set; }

        public IList<Tier> Tiers { get; private set; }

        public IList<GroupType> GroupTypes { get; private set; }


        //public async Task<IActionResult> OnGetAsync(int? id)
        // Snip.  It works fine

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("<dl>");
                foreach (var modelStateKey in ViewData.ModelState.Keys)
                {
                    var modelStateVal = ViewData.ModelState[modelStateKey];
                    foreach (var error in modelStateVal.Errors)
                    {
                        var key = modelStateKey;
                        var errorMessage = error.ErrorMessage;
                        var exception = error.Exception;
                        // You may log the errors if you want
                        sb.Append($"<dt>Key <span class=\"error-hilight\">{key}</span></dt><dd>{errorMessage}<br>{exception}</dd>{Environment.NewLine}");
                    }
                }
                sb.Append("</dl>");
                ErrorMessage = sb.ToString();
                return Page();
            }

            _db.Attach(Group).State = EntityState.Modified;

            try
            {
                await _db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                ErrorMessage = $"Group {Group.Id} not found!";
            }
            return RedirectToPage();
        }

        public async Task<IActionResult> OnPostDeleteAsync(int id)
        {
            var contact = await _db.Groups.FindAsync(id);
            if (contact != null)
            {
                _db.Groups.Remove(contact);
                await _db.SaveChangesAsync();
            }
            return RedirectToPage();
        }
    }
}

Listed below is the .cshtml page. 下面列出的是.cshtml页面。 It's an edit page, for updating details of an existing object. 这是一个编辑页面,用于更新现有对象的详细信息。 It display the current values, and then has a form below to modify values. 它显示当前值,然后在下面有一个表格来修改值。

The hidden values were added to ensure I was setting the [Required] properties of the object, but that didn't fix the issue. 添加了隐藏值以确保我设置了对象的[Required]属性,但这不能解决问题。

@page "{id:int?}"
@model GroupEditModel

@{
    ViewData["Title"] = "Edit Group";
}
<h2><i class="fas fa-users"></i> 
    @ViewData["Title"] - 
    @Model.Group.Id
    @Model.Group.Name</h2>

@if(Model.ErrorMessage != null)
{
    <div class="error">
        @(new HtmlString(Model.ErrorMessage))
    </div>

}

    <form method="post">
        <div asp-validation-summary="All"></div>
        <input asp-for="Group.Id" type="hidden" />
        <input asp-for="Group.OrgCode" type="hidden" />
        <input asp-for="Group.GroupTypeId" type="hidden" />
        <input asp-for="Group.ExcludeFromAlertStats" type="hidden" />

        <div class="form-static">
            <h3>Current Values</h3>
            <fieldset>
                <label>Name</label>
                <span class="readonly">@Model.Group.Name</span>
            </fieldset>

            <fieldset>
                <label>Parent</label>
                <span class="readonly">@Model.Group.Parent.Name</span>
            </fieldset>

            <fieldset>
                <label>Tier</label>
                <span class="readonly">@Model.Group.Tier.Id</span>  <span class="readonly">@Model.Group.Tier.Name</span>
            </fieldset>

            <fieldset>
                <label>Group Type</label>
                <span class="readonly">@Model.Group.GroupType.Name</span>
                <i class="fas fa-lock" title="This property requires admin rights to change"></i>
            </fieldset>

            <fieldset>
                <label asp-for="Group.OrgCode">Org Code</label>
                <span class="readonly">@Model.Group.OrgCode</span>
                <i class="fas fa-lock" title="This property requires admin rights to change"></i>
            </fieldset>
        </div>

        <div class="form-edit">
            <h3>Edit Values</h3>
            <fieldset>
                <label for="Group.Name">Name</label>
                <input asp-for="Group.Name" />
                <span asp-validation-for="Group.Name"></span>
            </fieldset>

            <fieldset>
                <label for="Group.ParentGroupId">Parent</label>
                <select asp-for="Group.ParentGroupId">
                    @foreach (Group parent in Model.ParentGroups)
                {
                    <option value="@parent.Id">@parent.Name</option>
            }
                </select>
            </fieldset>

            <fieldset>
                <label for="Group.TierId">Tier</label>
                <select asp-for="Group.TierId">
                    @foreach (Tier tier in Model.Tiers)
                {
                    <option value="@tier.Id">@tier.Name</option>
            }
                </select>
            </fieldset>

            <fieldset>
                <input type="submit" />
            </fieldset>
        </div>
    </form>


<h2><i class="fas fa-trash-alt"></i> Delete Group</h2>
<form method="post">
    <div class="form-delete">
        <fieldset>
            <i class="fas fa-trash-alt" style="color:red"></i>
            <button type="submit" asp-page="/App/GroupEdit" asp-page-handler="delete"
                    asp-route-id="@Model.Group.Id">
                Delete
            </button>
        </fieldset>
    </div>
</form>

您必须公开属性设置器。

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

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