C# Asp.Net核心2绑定对象为空
提交表单时,modelvalization.IsValid为true,但我在其上使用的[BindProperty]对象为null 页面模型 我在公共组{get;private set}属性上有[BindProperty]标记 在OnGetAsyncint?Id方法我使用.FindAsyncId查找组并填充表单。这很好: 我的理解是,OnPostAsync应该作为BindProperty注释的结果自动填充组对象。但是,一旦我发布,ModelState是有效的,但是Group对象是空的。我该如何解决这个问题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对象是空的。我该如何解决
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。谢谢你的回答。