AppUser
认同模式:
public virtual ICollection<UserPhones> UserPhones { get; set; }
用剃刀页,我称之为局部视图,就像这样:
@await Html.PartialAsync("_NameAndID", Model.AppUser)
PageModel:
[BindProperty]
public AppUser AppUser { get; set; }
public IActionResult OnGet()
{
AppUser = _userManager.Users
//.Include(x => x.UserAddresses) //OMITTED BC USING LAZY LOADING
.SingleOrDefaultAsync(x => x.UserName ==
_httpContext.HttpContext.User.Identity.Name).Result;
return Page();
}
在_NameAndID.cshtml
,我明确地引用来自特定电话UserPhones
实体。 附:
<input type="hidden" asp-for="UserPhones
.SingleOrDefault(z => z.Type == EnumPhoneType.Mobile).UserPhoneId" />
//other properties removed for brevity
<div class="rvt-grid__item">
<label asp-for="UserPhones.SingleOrDefault(z => z.Type == EnumPhoneType.Mobile).PhoneNumber">Mobile Phone</label>
<input asp-for="UserPhones.SingleOrDefault(z => z.Type == EnumPhoneType.Mobile).PhoneNumber" autocomplete="tel" />
<span asp-validation-for="UserPhones.SingleOrDefault(z => z.Type == EnumPhoneType.Mobile).PhoneNumber"></span>
</div>
在运行时,明确手机号码是否正确装入。 然而张贴到当public async Task<IActionResult> OnPostAsync()
相关AppUser.UserPhones
是null
。 ( 这个问题 )
你能帮我吗?
先感谢您!!!!
原因
在asp-for
不适合这种情况下很好地工作。
考虑到你的代码_NameAndID.cshtml
:
<input asp-for="UserPhones.SingleOrDefault(z => z.Type == EnumPhoneType.Mobile).PhoneNumber" autocomplete="tel" />
注意LINQ扩展方法.SingleOrDefault(...)
在这里。 在asp-for
这里不知道如何为得到名字UserPhones.SingleOrDefault(z => z.Type == EnumPhoneType.Mobile).PhoneNumber
,所以它只是呈现为PhoneNumber
。 其结果是,所呈现的HTML将是:
<input autocomplete="tel" type="text" id="PhoneNumber" name="PhoneNumber" value="">
比方说,有人输入的值911
,当发布到服务器,有效载荷将是:
PhoneNumber=911
作为服务器端的页面模型是:
[BindProperty]
public AppUser AppUser{get;set;}
public IActionResult OnGet()
{
// ...
}
public IActionResult OnPostAsync()
{
return Page();
}
注意AppUser.UserPhones
属性是一个集合。 换句话说, AppUser
期望的有效载荷,如:
UserPhones[0].UserPhoneId=1&UserPhones[0].PhoneNumber=911&UserPhones[1].UserPhoneId=2&UserPhones[1].PhoneNumber=119
但是,您向服务器发送的是:
PhoneNumber=911
所以App.UserPhones
永远是零和AppUser.PhoneNumber
属性将是911
。
怎么修
首先,为了以结合UserPhones
自动更改的类型App.UserPhones
到IList<UserPhones>
使我们可以使用一个索引语法
public class AppUser : IdentityUser{
// public virtual ICollection<UserPhones> UserPhones { get; set; }
public virtual IList<UserPhones> UserPhones { get; set; }
}
其次,在不使用复杂的查询asp-for
,使用简单的索引语法来代替。 例如,如果你想发布一些UserPhones
或帖子UserPhones
,你可以添加一个索引为每个字段:
@for(var i=0;i <Model.UserPhones.Count(); i++) {
<div class="rvt-grid__item">
<label asp-for="@Model.UserPhones[i].UserPhoneId"></label>
<input asp-for="@Model.UserPhones[i].UserPhoneId"/>
<label asp-for="@Model.UserPhones[i].PhoneNumber"></label>
<input asp-for="@Model.UserPhones[i].PhoneNumber"/>
<span asp-validation-for="@Model.UserPhones[i].PhoneNumber"></span>
</div>
}
这样一来,当有人提交表单, AppUser.UserPhones
将是正确设置。 下面是演示截图: