更新相关的实体(Updating related entities)

2019-09-30 02:25发布

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.UserPhonesnull 。 ( 这个问题

你能帮我吗?

先感谢您!!!!

Answer 1:

原因

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.UserPhonesIList<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将是正确设置。 下面是演示截图:



文章来源: Updating related entities