2017-12-15 49 views
0

のは、私はこれらの2つのエンティティを持っているとしましょう:ASP.NET MVCコアEntity Frameworkのサブエンティティの結合

public class Person 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long id_person {get;set;} 

    [Column(TypeName = "varchar(255)")] 
    [StringLength(255)] 
    public String name {get;set;} 
} 

public class InterestCenter 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long id_interest {get;set;} 

    [Column(TypeName = "varchar(255)")] 
    [StringLength(255)] 
    public String name {get;set;} 
} 

私はこの2つのエンティティ間の多くの関係に多くを設定します。つまり、Personには多くのインタレストセンターを持つことができます。ここで

は、私がやったことです:

public class PersonHasInterestCenter 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long id {get;set;} 

    [ForeignKey("person")] 
    public long id_person {get;set;} 
    public virtual Person person { get; set; } 

    [ForeignKey("interestcenter")] 
    public long id_interest {get;set;} 
    public virtual InterestCenter interestcenter { get; set; } 
} 

今私はPersonを編集して保存するために、コントローラのアクションとCSHTMLかみそりビューを作成したいです。私がしたいのは、利用可能な全ての中間駅でチェックボックスのセットを表示することです。ここで

は、私がやったことです:

[HttpPost] 
public async Task<IActionResult> MyAction(long id, [Bind("id_person,name")] Person p) 
{ 
    ViewBag.interestcenters = mydbcontext.interestcenters; 
    ViewBag.message = ""; 

    if (p.name == "") 
    { 
     ViewBag.message = "You need to set name."; 
    } 
    else if (ModelState.IsValid == false) 
    { 
     ViewBag.message = string.Join("; ", ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage)); 
    } 
    else 
    { 
     mydb_context.Update(p); 
     await mydb_context.SaveChangesAsync(); 
     return RedirectToAction(nameof(Index)); 
    } 

    return View(p); 
} 

そしてここでは、関連するCSHTMLかみそりビューは次のとおりです。

@model myproject.Person 

<form asp-action="MyAction"> 
    <div>@ViewBag.message</div> 
    <input type="hidden" asp-for="id_person" /> 
    <input asp-for="name" /> 

@foreach (var name in ViewBag.interestcenters) 
{ 
    <input type="checkbox" asp-for="WHAT_SHOULD_I_PUT_THERE" />@item.name 
} 

    <input type="submit"> 
</form> 

すべては人の名前を作成または更新のために素晴らしい作品が、私はとの問題を抱えていますインタレストセンターのチェックボックス。私はまた、ビューモデルを作成しようとしました。しかし、私それを動作させるために管理していない...あなたの助けを

おかげ

答えて

0

簡単な答えはチャンスがあるたびのviewmodelsを使用して...です。だから、すべてあなたを

[HttpPost] 
public async Task<IActionResult> MyAction(MyViewModel model) 
{ 
    // Something was not filled or did not match your requirements 
    if (!ViewState.IsValid) 
    { 
     return View(model); 
    } 

    // All good. To your stff here 

    return Ok(); 
} 

:あなたのポストに

[HttpGet] 
public async Task<IActionResult> MyAction(long id) 
{ 
    var _InterestCenters = mydbcontext.interestcenters; 

    // Create your vm here 
    var model = new MyViewModel 
    { 
     UserId = id, 
     InterestCenters = _InterestCenters.Select(p => new InterestCenterViewModel 
     { 
      Id = p.Id, 
      Name = p.Name 
      IsSelected = false 
     }).ToList() 
    } 

    return View(model); 
} 

:getメソッドで

public class MyViewModel 
{ 
    public long UserId { get; set; } 
    public List<InterestCenterViewModel> InterestCenters { get; set; } 
} 

public class InterestCenterViewModel 
{ 
    public int Id { get; set; } 
    public bool IsSelected { get; set; } 
    public string Name { get; set; } 
} 

:あなたがに似たものを作成することができ、それらの利益をバインドするために

上記のモデルを使用して作成したインタレストのリストをビューに渡す必要があります。

<input asp-for="UserId" type="hidden" /> 
@for(int i = 0; i < MyViewModel.InterestCenters.Count; i++) 
{ 
    <input type="checkbox" asp-for="MyViewModel.InterestCenters[i].IsSelected" />@MyViewModel.InterestCenters[i].Name 
} 

リストで作業する場合は、foreachの代わりにforを使用する必要があります。生成されたhtmlは、項目の違いを作る方法である名前の代わりに、そのインデックスiを使用しています。ここで

はどのようにのviewmodelsとasp.netの作品を記述するリンクです:Microsoft official documentation

+0

おかげではなく、どのようにコントローラでこののviewmodelを埋め込むのですか? – Bob5421

+0

私はvmを使い始めるのに役立つ私の回答を編集しました。私は見てみることをお勧めするドキュメンテーションへのリンクを掲載しました。 –

+0

私はポストバックすると、私はinterestcenterの名前は表示されませんが、私はチェックボックスを見ることができます。誰かがデータベースに興味のある場所を追加した場合、チェックボックスの入力はその場所(i)で識別され、IDは存在しないので間違っています... – Bob5421

関連する問題