2017-09-26 260 views
0
做的创建和更新一对多对象的动作

正确方法我正在我的第一对.NET核心应用程序,我能够把一起为我的第一个表的CRUD操作。在.net核心Ef中的核心

第二个表有一个外键第一个表,我想我已经在努力放在一起创建和更新行动关闭了在错误的道路上。更新操作需要传入外键表中的所有项目以供用户选择。但作为一个更新操作,查看需要具有从下拉列表中选择外键的实际对象。

这样做的正确方法是什么?我似乎无法在Google上找到一致的答案。

表1型号:

public class HTMLElement 
{ 
    public int Id { get; set; } 
    public string Element { get; set; } 
    public string ElementName { get; set; } 

    public virtual ICollection<CustomizedElement> CustomizeHTMLElements { get; set; } 
} 

表2型号:

public class CustomizedElement 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int? HTMLElementId { get; set; } 
    public HTMLElement HTMLElement { get; set; } 
} 

视图模型为表二:

public class CustomizedHTMLElementViewModel 
{ 
    [Display(Name = "Name")] 
    public string Name { get; set; } 

    [Display(Name = "HTML Element")] 
    public int HTMLElement { get; set; } 

    [Display(Name = "HTML Elements")] 
    public ICollection<HTMLElement> HTMLElements { get; set; } 
} 

创建控制器:

我想通过在所有的项目从表1成,用户可以从中选择这个工作,但不知道这是否是这样做的正确方法下拉列表的视图。

[HttpGet] 
    public IActionResult AddCustomizedHTMLElement() 
    { 
     var elements = new CustomizedHTMLElementViewModel 
     { 
      HTMLElements = db.HTMLElements.ToList() 
     }; 

     return View(elements); 
} 

邮政行动正在工作,但不知道它是否是最有效的。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult AddCustomizedHTMLElement(CustomizedHTMLElementViewModel CHTMLEV) 
    { 
    if (ModelState.IsValid) 
    { 
     var element = db.HTMLElements.Single(e => e.Id == CHTMLEV.HTMLElement); 

     CustomizedElement cElement = new CustomizedElement() 
     { 
      Name = CHTMLEV.Name, 
      HTMLElement = element, 
     }; 
     db.CustomizedElements.Add(cElement); 
     db.SaveChanges(); 
     return RedirectToAction("CustomizedHTMLElements"); 
    } 
    return View(CHTMLEV); 
} 

我在更新操作中遇到困难。我想在所有的外键通过,但也有在下拉列表中选择在视图

[HttpGet] 
public IActionResult UpdateCustomizedHTMLElement(int Id) 
{ 
    var mElement = db.CustomizedElements.Include(e => e.HTMLElement).FirstOrDefault(e => e.Id == Id); 
    ViewBag.ElementsList = db.HTMLElements.ToList(); 
    return View(mElement); 
} 

我还没有更新的动作[HttpPost]工作还没有,直到我得到的视图外键对象对。

更新视图:

<form method="post" asp-controller="Templates" asp-action="UpdateCustomizedHTMLElement"> 
    <div class="form-group"> 
     <label asp-for="Name"></label>: 
     <input class="form-control form-control-sm" type="text" asp-for="Name" /> 
     <span class="text-danger" asp-validation-for="Name"></span> 
    </div> 
    <div class="form-group"> 
     <label asp-for="HTMLElement"></label>: 
     @Html.DropDownListFor(m => m.HTMLElement, new SelectList(ViewBag.ElementsList, "Id", "Element"), new { @class = "form-control" }) 
     <span class="text-danger" asp-validation-for="HTMLElement"></span> 
    </div> 
    <div> 
     <button class="btn btn-primary" type="submit" value="Submit">Save</button> 
     <button class="btn btn-secondary" type="button" value="Cancel" onclick="location.href='@Url.Action("CustomizedHTMLElements", "Templates")'">Cancel</button> 
    </div> 
</form> 

回答

-1
public class UpdateCustomizedHTMLViewModel 
{ 
    public int SelectedHtmlElementId { get; set;} 
    public CustomizedElement ElementToUpdate { get; set;} 
    public ICollection<HTMLElement> HTMLElements { get; set;} 
} 

然后填写ElementToUpdate和HTML元素在你的GET,当你选择HTML元素要与在下拉列表中分配该ID来SelectedHtmlElementId

+0

这是更新作为评论更合适。当你有代表时,考虑评论。如果您想回答这个问题,请提供完整的答案。 –