【问题标题】:How to make updates in multiple tables within many to many relationship?如何在多对多关系中的多个表中进行更新?
【发布时间】:2021-08-07 05:55:31
【问题描述】:

我有一个多对多的关系,我正在尝试一键更新两个表。一个用于appUser,另一个用于userLinks

我的问题是我总是得到appUser 数据,却从来没有得到userLinks 数据。

模型类:

public class AppUser: IdentityUser
{
    public string Name { get; set; }
    public string Bio { get; set; }
    public List<UserLink> userLinks { get; set; }
}

public class UserLink
{
    [Key]
    public Guid Id { get; set; }
    public string linkUrl { get; set; }

    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public AppUser GetUser { get; set; }

    public Guid LinkId { get; set; }
    [ForeignKey("LinkId")]
    public Link GetLink { get; set; }
}

public class Link
{
    public Guid Id { get; set; }
    public string linkIcon { get; set; }
    public string linkName { get; set; }
    public int ordr { get; set; }
    public bool IsPdf { get; set; } = false;
    public List<UserLink> userLinks { get; set; }

}

查看模型:

public class VMUserProfile
{
    public AppUser appUser { get; set; }
    public List<UserLink> userLinks { get; set; }
    public List<Link> links { get; set; } 
}

查看:

@model VMUserProfile          

<form asp-action="EditProfile" asp-route-id="@Model.appUser.Id" method="post">
...
<ul id="linkList" class="list-group">
    @foreach (var item in Model.userLinks.Where(w => w.UserId == Model.appUser.Id).ToList())
    {
        <li class="list-group-item">
            <div class="input-group">
                <div class="input-group-text">
                    @Html.Raw(item.GetLink.linkIcon)
                </div>
                <input asp-for="@item.linkUrl" id="@item.Id" class="form-control" placeholder="@item.GetLink.linkName" type="text" />
                <div class="input-group-text">
                    <i class="far fa-times-circle deleteLi"></i>
                </div>
            </div>
        </li>
    }
</ul>
...
</form>

这是视图外观和调试结果

并在网络部分注意formdata 如何包含 URL,但我从未在控制器操作中收到它们,调试结果返回 null

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-core


    【解决方案1】:

    您对视图模型的绑定方式不适用于对象列表(用户链接)。

    要绑定对象列表,MVC 有一个约定。也就是说,您应该使用列表项的索引位置。

    @model VMUserProfile 
    
    @{
        ViewData["Title"] = "Edit profile";
    }
    
    <form asp-action="EditProfile" asp-route-id="@Model.appUser.Id" method="post">
    
         <ul id="linkList" class="list-group">
            @for (var i = 0; i < Model.userLinks.Count; i++)
            {
                <li class="list-group-item">
                   <div class="input-group">
                      <div class="input-group-text">
                         @Html.Raw(Model.userLinks[i].GetLink.linkIcon)
                      </div>
    
                      @*solution*@
                      <input asp-for="userLinks[i].linkUrl" id="@Model.userLinks[i].Id" class="form-control" placeholder="@Model.userLinks[i].GetLink.linkName" type="text"/>
                      <input type="hidden" asp-for="userLinks[i].Id"/>
                     
                     <div class="input-group-text">
                         <i class="far fa-times-circle deleteLi"></i>
                     </div>
                   </div>
               </li>
            }
         </ul>
    
         <input type="submit" name="Edit" class="btn-success">
    
    </form>
    

    您在视图上添加到视图模型的过滤器,

    Model.userLinks.Where(w => w.UserId == Model.appUser.Id).ToList()
    

    这应该转到 [HTTPGet] EditProfile(或其他)操作。

    [HttpGet]
    public IActionResult EditProfile()
    {
        var appUser = Get_AppUser();
        var userLinks = Get_UserLinks();
    
        var model = new VMUserProfile
        {
            appUser = appUser,
            userLinks = userLinks.Where(w => w.UserId == appUser.Id).ToList() //filter should be here
         };
            
       return View(model);
    }
    

    【讨论】:

      【解决方案2】:

      您可以在将 UserLinks 更改为 List&lt;String&gt; 而不是 List&lt;UserLink&gt; 后重试。

      更新答案

      查看:

       @for (int i = 0; i < Model.userLinks.Count; i++)
        {
           <li class="list-group-item">
                      <div class="input-group">
                          <div class="input-group-text">
                          </div>
                          @Html.HiddenFor(m => Model.userLinks[i].Id)
                          @Html.TextBoxFor(m => Model.userLinks[i].linkUrl)
                          <div class="input-group-text">
                              <i class="far fa-times-circle deleteLi"></i>
                          </div>
                      </div>
                  </li>
              }
      

      控制器获取:

      将数据分配给用户链接为Model.userLinks.Where(w =&gt; w.UserId == Model.appUser.Id).ToList()

      控制器职位:

      对于新的 Url,Id 将为 0,并且已经存在的 url 带有它们的 id。

      【讨论】:

      • 我需要 UserLinks,因为它适用于另一个上下文。此外,我需要 url 和 Id,我还需要获得没有 Id 的新 url。所以我用 id 更新 url,然后插入没有 id 的 url。
      • 如果用户点击黄色按钮,他们可以添加没有 ID 的新 url。并且已经存在的 url 带有 ids,在这种情况下,如果有的话,它们可以更新
      猜你喜欢
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2018-05-14
      • 2013-11-20
      • 2021-04-11
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多