2017-09-26 316 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

這是更新作爲評論更合適。當你有代表時,考慮評論。如果您想回答這個問題,請提供完整的答案。 –