代码之家  ›  专栏  ›  技术社区  ›  coolhand

将对象的永久集合添加到.NET Core中的另一个对象

  •  0
  • coolhand  · 技术社区  · 6 年前

    我正在收集 <AppUser> 其他对象中的对象 Project 反对。

    我的模型:

    public class Project
        {
            public int ProjectID { get; set; }
    
            [Required(ErrorMessage = " Please enter a project name")]
            public string Name { get; set; }
    
            [Required(ErrorMessage = " Please enter a project description")]
            public string Description { get; set; }
    
            //HERE'S MY COLLECTION OF <APPUSER> OBJECTS
            public virtual ICollection<AppUser> ProjectManagers { get; set; }
        }
    

    在我看来,我需要一封与 <应用程序用户> 添加到此列表中。以下是与此视图关联的ViewModel:

    public class AddProjectManagerViewModel
        {
            [Required]
            [EmailAddress(ErrorMessage = "Please ensure email is valid")]
            [UIHint("email")]
            public string Email { get; set; }
    
            public int ProjectID { get; set; }
        }
    

    以及观点:

    @model AddProjectManagerViewModel
    @{
        ViewBag.Title = "Add PM";
        Layout = "_Layout";
    }
    <div class="col-xs-12 buffer">
        <div class="text-center">
            <h3>Enter the new Project Manager's email:</h3>
        </div>
        <div><span asp-validation-for="Email" class="text-danger"></span></div>
    
        <form asp-action="AddProjectManager">
            <div class="form-group">
                <label asp-for="Email"></label>
                <input asp-for="Email" class="form-control" />
            </div>
            <div class="text-center">
                <button class="btn btn-primary" asp-route-projectId="@Model.ProjectID" type="submit">Add to PMs</button>
            </div>
        </form>
    </div>
    

    在我的控制器中,我有post方法。问题是, List<AppUser> 没有坚持并且出现了 null 每次调用action方法时:

    [HttpPost]
            [Authorize]
            public async Task<IActionResult> AddProjectManager(int projectId, string email)
            {
                var pmToAdd = await userManager.FindByEmailAsync(email);
                if (pmToAdd != null)
                {
                    var proj = repository.Projects.FirstOrDefault(p => p.ProjectID == projectId);
                    if(proj != null)
                    {
                        //HERE proj.ProjectManagers IS ALWAYS NULL EVEN IF THIS METHOD HAS BEEN PREVIOUSLY CALLED SUCCESSFULLY
                        if(proj.ProjectManagers == null) { proj.ProjectManagers = new List<AppUser>(); }
                        proj.ProjectManagers.Add(pmToAdd);
                        TempData["message"] = $"{pmToAdd.Email} added to {proj.Name} Project Managers";
                        return View("Edit", proj );
                    }
                    TempData["message"] = $"Error finding project in database.";
                    return View();
                }
                TempData["message"] = $"User not found. Ensure that email is linked to a registered user";
                return View();
    
            }
    

    我应该如何设置这种方法来使模型 public virtual ICollection<AppUser> ProjectManagers { get; set; } 坚持不懈?

    编辑 以下是我的存储库方法:

    public void AddProjectManager(int projectID, AppUser user)
            {
                Project proj = context.Projects.FirstOrDefault(p => p.ProjectID == projectID);
                if(proj != null)
                {
                    proj.ProjectManagers.Add(user);
                    context.SaveChanges();
                }
            }
    

    我也变了 proj.ProjectManagers.Add(pmToAdd); repository.AddProjectManager(projectId, pmToAdd); 在行动方法中,但是 List<AppUser>' is still 每次调用时为空

    0 回复  |  直到 6 年前
    推荐文章