Razorを使用してドメインモデルの階層のフォームを作成する
-
21-12-2019 - |
質問
次のクラスを持っていると言うことができます(あなたもその関係部分の観点からの私のクラスが正しいかどうかを考慮することができます):
public class EFDbContext : DbContext
{
public DbSet<Project> Projects { get; set; }
public DbSet<Address> Addresses { get; set; } // *
public DbSet<Country> Countries { get; set; } // *
// Custom model builder bindings for * coz of the plural issue with EF
}
public class Project
{
public int ProjectID { get; set; }
public string Name { get ; set; }
public int AddressID { get; set; } // Database relation column
public Address Address { get ; set; }
}
public class Address
{
public int AddressID { get; set; }
public string Address1 { get ; set; }
public string Address2 { get ; set; }
public int CountryID { get; set; } // Database relation column
public Country Country { get ; set; }
}
public class Country
{
public int CountryID { get; set; }
public string Name { get; set; }
}
.
このためにかみそりをすることについてどう思いますか...
私の「プロジェクトの作成」ページは、このようなものに見える形式を必要とするでしょうが、これは正しく正しくありませんか?
@model Project
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address)
</div>
</div>
.
だから私はShared/EditorTemplates/Address.cshtml
を作成し、それからアドレスフォームを構築した:
@model Address
<div class="form-group">
@Html.LabelFor(model => model.Address1, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address1)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address2, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address2)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Country, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Country)
</div>
</div>
.
と最後に国を1つ...それが必要なので、これを行うことができないCendicetAgCodeに追加されたカスタムクラスが追加されました。
@model Country
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBox("", Model.Name.ToString(), new { @class = "countries typeahead" })
</div>
</div>
.
これは正しく正しくありませんか?私はそれが非常に圧倒的で混乱を見つける(BTW、私はこれを試してみました、そしてそれはうまくいっていません...しかし、それはそれが正しい方法であることを知っていたら私はその方向に押すことができます)!
解決
あなたは正しいトラックにいます。あなたがプロジェクト構造にあなたのEditorTemplatesを配置する場所に注意してください。MVC条約は必ずしもあなたが希望する方法で働くわけではありません。モデルがリストに折り返されたときに単一のモデルのためのエディタテンプレートを使用します。
かみそりのビューに渡されたモデルのための完全に別の「ビューモデル」を使用することになる1つの提案。View ModelとEntity Frameworkモデル(AKAデータモデル)の間をマッピングすることができます。どうして?あなたは彼らがさまざまなことを必要とするのに時間が経つでしょう。モデルプロパティのMVC属性
所属していません StackOverflow