C# Asp.Net核心2绑定对象为空

C# Asp.Net核心2绑定对象为空,c#,asp.net-core-2.0,razor-pages,C#,Asp.net Core 2.0,Razor Pages,提交表单时,modelvalization.IsValid为true,但我在其上使用的[BindProperty]对象为null 页面模型 我在公共组{get;private set}属性上有[BindProperty]标记 在OnGetAsyncint?Id方法我使用.FindAsyncId查找组并填充表单。这很好: 我的理解是,OnPostAsync应该作为BindProperty注释的结果自动填充组对象。但是,一旦我发布,ModelState是有效的,但是Group对象是空的。我该如何解决

提交表单时,modelvalization.IsValid为true,但我在其上使用的[BindProperty]对象为null

页面模型

我在公共组{get;private set}属性上有[BindProperty]标记

在OnGetAsyncint?Id方法我使用.FindAsyncId查找组并填充表单。这很好:

我的理解是,OnPostAsync应该作为BindProperty注释的结果自动填充组对象。但是,一旦我发布,ModelState是有效的,但是Group对象是空的。我该如何解决这个问题

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();
        }
    }
}
下面列出的是.cshtml页面。这是一个编辑页面,用于更新现有对象的详细信息。它显示当前值,然后在下面的表单中修改值

添加隐藏值是为了确保我设置了对象的[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>

您必须将属性设置器公开。

您必须将属性设置器公开。

非常确定设置器也必须是公开的。你试过了吗?艾尔格德。做一个回答,我会接受@mcguirev10,非常确定setter也必须是公共的。你试过了吗?艾尔格德。回答这个问题,我会接受@mcguirev10对于那些刚接触这个框架的人来说,很容易忽略一些简单的东西,比如私人setter。谢谢你的回答。对于那些刚接触这个框架的人来说,很容易忽略一些简单的东西,比如私人setter。谢谢你的回答。