私はカスタムモデルバインダーasp.netコア2を構築する問題があります。 私はこれを読んでTutorialしかし、それは私が必要なものではありません。asp.netコア2複雑なモデルのカスタムモデルバインダー
私は、ビルドの例を持っていると私はそのような単純なPersonクラス持っgithub
に置く:私は新しい人を追加すると
public class Person
{
public int ID { get; set; }
[Required]
public string Firstname { get; set; }
[Required]
public string Surename { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:dd.MMM.yyyy}")]
public DateTime DateOfBirth {get;set;}
[Required]
public Country Country { get; set; }
}
public class Country
{
public int ID { get; set; }
public string Name { get; set; }
public string Code { get; set; }
}
が、私はHTMLのselectタグで国を選択することができますが。しかし、selectタグの値は国のIDです。私はバインダーをデータベースで検索し、適切な国をモデルに追加します。
コントローラにメソッドを作成するには、次のようになります
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,Firstname,Surename,DateOfBirth")] Person person, int Country)
{
ViewData["Countries"] = _context.Countries.ToList();
if (ModelState.IsValid)
{
_context.Add(person);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(person);
}
私はまた、データをバインドするIModelBinderを実装:
public class PersonEntityBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
// here goes the fun
// looking for the countryId in the bindingContext
// binding everything else except the CountryID
// search the Country by countryID and put it to the model
return Task.CompletedTask;
}
}
質問は、私が書いたように私はこれを行うことができる方法であり、バインダーのコメントに? 誰かがアイデアやベストプラクティスのソリューションですか?
についてChris
あなたは、基本的なアクションのCOMPLEXE何かをしたいのはなぜ?プロパティを追加するだけです。public int CountryId {get;あなたのモデルに国のIDを設定してください.Entityフレームワークはあなたに残ります – OrcusZ