2

Entity Framework が正しく設定されていて、POCO クラスが適切な関係を持っていると仮定します。

<!-- language: c# -->
public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string SomeFieldIDontWantUsersToEdit { get; set; } // there are a lot of these
    public IList<Address> Addresses { get; set; }
}

public class Address
{
    public string EntireAdressInOneLine { get; set; }
}

ユーザーに表示するときは、FirstName と LastName、および住所のみを表示したいと考えています。それは機能し、ビューは適切に機能しています。

これは私の見解です:

<!-- language: c# -->
@using (Html.BeginForm(actionName: null, controllerName: null, method: FormMethod.Post))
{
    @Html.TextBoxFor(model => Model.Person.FirstName)
    @Html.TextBoxFor(model => Model.Person.LastName)
    @Html.HiddenFor(model => Model.Person.Id)
}

しかし、このエントリを更新するときが来たら、私は迷子になります。これが更新のアクションである場合:

<!-- language: c# -->
[HttpPost]
public ActionResult UpdatePerson(int personId, Person updatedPerson)
{
    if (ModelState.IsValid)
    {

    }
}

フォームを送信すると、モデル バインダーは Person オブジェクトが必要であることを認識します。かっこいい、それはうまくいきます。もちろん、 SomeFieldIDontWantUsersToEdit はビューに含まれていないため null になります。その部分は理解しています。

私の質問は、このエンティティの特定のプロパティのみを更新し、他のすべてのプロパティに既に存在していた値を使用することを EF に伝える方法があるかどうかです。

SomeFieldIDontWantUsersToEdit の元の値を同じにしたいのですが、ユーザーが名と姓を編集できるようにしたいと考えています。1 つまたは 2 つのフィールドだけであれば、もちろん手動で実行できますが、実際のコードではもっと多くのフィールドがあります。

おそらくより良い質問は、これを行うための適切な/推奨される方法は何ですか?

4

2 に答える 2

1

次のようなViewModelを実際に作成してみませんか。

public class PersonalInfoModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

そして、あなたのアクションにそのタイプを受け取らせるだけです:

[HttpPost]
public ActionResult UpdatePerson(PersonalInfoModel updatedPerson)
{
    if (ModelState.IsValid)
    {

    }
}

このシナリオでは、コンテキストに移動し、を使用して実際のエンティティをロードしPersonalInfoModel.Id、更新する2つのプロパティを更新する必要があります。

実際のエンティティをモデルとして使用することは必須ではありません。情報の独自の表現を作成できます(実際のエンティティを使用する代わりに、いくつかのケースで推奨されます)。

于 2012-06-26T03:25:39.003 に答える
1

手作業で「マッピング」を行いたくない場合は、Automapperを使用してください。

于 2012-06-26T00:53:57.383 に答える