1

次のモデル クラスがあります (最初に EF コードを使用してテーブルを生成しています)。

public class MyClass
{
    ....
    [Required, ForeignKey("Address")]
    public int Address1Id { get; set; }
    virtual public Address Address1 { get; set; }
    [Required, ForeignKey("Address")]
    public int Address12d { get; set; }
    virtual public Address Address2 { get; set; }
    [Required, ForeignKey("Address")]
    public int Address3Id { get; set; }
    virtual public Address Address3 { get; set; }
    ....
}
public class Address { .... }

の作成ビューにMyClassすべての住所フィールドが表示され、MyClass. しかし、足場は住所の DropDownList ボックスを生成しました。MyClassこれらの住所フィールドがクラスで直接コード化されているように動作するようにコードを変更し、コントローラーがアドレスを tableAddressおよびAddressIDtableに保存できるようにする方法はMyClass?

    <div class="editor-label">
        @Html.LabelFor(model => model.Address1Id, "Address")
    </div>
    <div class="editor-field">
        @Html.DropDownList("Address1Id", String.Empty)
        @Html.ValidationMessageFor(model => model.Address1Id)
    </div>

更新: 次の ViewModel を作成しようとしましたが、クラスにキーが定義されていないとスキャフォールディングが訴えます。

public class DealViewModel
{
    public Deal Deal { get; set; }
    public Address Address { get; set; }
}
4

2 に答える 2

1

MVC でビューを編集/作成するためにモデルをフラット化する方法を尋ねているようです。Person を作成してから Address を作成する必要はなく、1 つの画面で作成できます。それがあなたが求めているものなら、はい、あなたはそれをすることができます! 実際、作成ビューを次のように変更するのと同じくらい簡単です。

<h3>Address 1</h3>
@Html.EditorFor(x => x.Address1)
<h3>Address 2</h3>
@Html.EditorFor(x => x.Address2)
...etc

デフォルトでは、MVC は「エディタ」Addressがどのように見えるべきかを推測するのに十分なほどスマートです。文字列用のテキスト フィールド、ブール値用のチェックボックスなど。[HttpPost]コントローラが次のようになっている場合:

[HttpPost]
public ActionResult Create(Person person)
{
    if (ModelState.IsValid)
    {
        var context = new AppDbContext();
        context.People.Add(person);
        context.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(personViewModel);
}

personデバッガーで調べると、Addressプロパティがすべて入力されていることがわかります。そうです、MVC ModelBinder はとてもスマートです! 他に何もする必要はありません。

注:プロジェクトが進行し、データ モデルがより複雑になるのは避けられないため、コントローラーとビューの間でモデル オブジェクトをやり取りする際に問題が発生する場合があります。ビューの「モデル」を表す単純なオブジェクトである ViewModels を使用するパターンに従うことを強くお勧めします。つまり、クライアントとやり取りするすべてのデータをバンドルする必要があります。これにより、データ モデルをフラット化し、実際に必要なフィールドのみを含めることができます。この特定の例では、このパターンを使用する必要はないかもしれませんが、将来役に立つでしょう。

お役に立てれば!

于 2013-02-18T04:08:29.183 に答える
1

外部キー属性が正しくありません:

[Required, ForeignKey("Address1")]
...
[Required, ForeignKey("Address2")]
...
[Required, ForeignKey("Address3")]
...

(そしてAddress12d、私が推測するタイプミスです)

于 2013-02-17T10:41:28.420 に答える