私はこの難問を何日も探していて、多くの可能な解決策を考えていましたが、例が私が試みているものから遠すぎて、データを取り込むのに十分ではありません。したがって、私は自分自身に質問をして、私の特定の状況を示すことにしました。
このような製品モデルを入手しました(簡略化)
public class Product
{
[Key]
public int ProductId { get; set; }
public string SKU { get; set; }
public int ProductCategoriesId { get; set; }
public bool Purchase { get; set; }
public bool ShowProduct { get; set; }
public virtual IList<ProductTranslations> ProductTranslations { get; set; }
}
public class ProductTranslations
{
[Key]
public int ProductTranslationsId { get; set; }
public int ProductId { get; set; }
public string ProductLanguage { get; set; }
public string Description { get; set; }
public string ProductName { get; set; }
public virtual Product Product { get; set; }
}
したがって、言語に中立なデータを持つ 1 つの製品があり、各製品には言語ごとに 1 つずつ、複数の子要素を含めることができます。言語に依存しないデータと言語固有のデータ (名前と説明) を表示する編集フォームがあります。
簡略図:
@model Artikelhantering.Models.Product
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.SKU)
@foreach (var item in Model.ProductTranslations)
{
@Html.EditorFor(TranslationItem => item.ProductName)
@Html.TextAreaFor(TranslationItem => item.Description)
}
<p>
<input type="submit" value="Save" />
</p>
}
これにより、すべてが見栄えがよく整頓されたビューに表示されます。後でエディタービュー専用のビューモデルを作成できる(すべきですか?)と思います。とにかく問題は、送信時にデータを更新する方法がわからないことです。通常の EF アプローチを使用して言語に依存しないデータを更新できますが、他のモデルからのフィールドへの変更は変更されません...
正直なところ、フォームにはそれらを区別するものは何もなく、一意のIDなどもなく、製品モデルにもそれらのフィールドが含まれていないため、それは私にとって完全に理にかなっています... 古い古典的なASPでこれを行う方法は次のようになります一意の ID でフィールドに名前を付け、フォームの送信時に各子モデルを更新する SQL 更新クエリを作成します。ここでもそのようなプラクティスを実装できると思いますが、物事を進める正しい方法とは思えません。
この種のことについて、MVC に適切な、または「ベスト プラクティス」のアプローチはありますか?