2017-09-26 7 views
0

私の最初の.Netコアアプリケーションで作業しており、私の最初のテーブルのCRUDアクションをまとめることができました。.Net Core Ef Coreの1対多のオブジェクトに対してCreateアクションとUpdateアクションを行う正しい方法

第2のテーブルには、最初のテーブルへの外部キーがあります。作成と更新のアクションをまとめようとすると、間違ったパスに出てしまったと思います。 Updateアクションは、ユーザーが選択するために外部キーテーブルのすべての項目を渡す必要があります。しかし、更新アクションとして、ビューは、ドロップダウンリストから選択された実際のオブジェクトの外部キーを持つ必要があります。

これを行う正しい方法は何ですか?私は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; } 
} 

のViewModel表のための2:

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); 
} 

POSTアクションが働いて、それが最も効率的かどうかわからないです。

[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とHTMLElementsを記入し、あなたがのHTMLElementを選択したときにドロップダウンであなたはIdがこれは

+0

SelectedHtmlElementIdすることを割り当てるで更新しますより適切なコメントとして。担当者がいるときはコメントすることを検討してください。質問に答えたい場合は、完全な回答を入力してください。 –

関連する問題