3

私は EF4 (Db First) を使用しており、多くの null 非許容プロパティを持つエンティティがあります。

編集フォーム (Razor/MVC3) で、1 つのプロパティのみの編集を許可し、他のプロパティは編集できないようにしたいと考えています。

これを機能させるには@Html.HiddenFor(...)、null 値を許容できない他の各プロパティにステートメントを配置する必要があります。そうしないと、SaveChanges() でエラーが発生します。

ビューでIDを非表示にし、編集可能なプロパティを作成して、そのプロパティのみを更新する簡単な方法はありますか?

4

1 に答える 1

8

この場合に必要なことは、編集しているエンティティの ID を非表示フィールドとして含めるだけでなく、実際に編集するプロパティのテキスト フィールドを含めることだけです。

@using (Html.BeginForm())
{
    @Html.HiddenFor(x => x.ID)
    @Html.EditorFor(x => x.PropertyYouWannaEdit)
    <button type="submit">Update</button>
}

次に、対応するコントローラー アクションで、編集が必要なエンティティをデータベースから取得し、編集が必要なプロパティの値を更新して、変更を保存します。

[HttpPost]
public ActionResult Update(SomeEntity model)
{
    SomeEntity entityToEdit = db.GetEntity(model.ID);
    entityToEdit.PropertyYouWannaEdit = model.PropertyYouWannaEdit;
    db.Update(entityToEdit);
    return RedirectToAction("Success");
}

しかし個人的には、ビュー モデルとAutoMapperを使用してこの状況を処理します。したがって、ビューの要件を表すビュー モデルを設計し、編集のみが必要なプロパティを含めることから始めます。

public class MyEntityViewModel
{
    public int ID { get; set; }
    public string Property1ToBeEdited { get; set; }
    public string Property2ToBeEdited { get; set; }
    ...
}

そして、対応するビューを持っています:

@model MyEntityViewModel
@using (Html.BeginForm())
{
    @Html.HiddenFor(x => x.ID)

    @Html.EditorFor(x => x.Property1ToBeEdited)
    @Html.EditorFor(x => x.Property2ToBeEdited)
    ...

    <button type="submit">Update</button>
}

そして最後に 2 つのコントローラー アクション (GET と POST):

public ActionResult Update(int id)
{
    // Fetch the domain model that we want to be edited from db
    SomeEntity domainModel = db.GetEntity(id);

    // map the domain model to a view model
    MyEntityViewModel viewModel = Mapper.Map<SomeEntity, MyEntityViewModel>(domainModel);

    // pass the view model to the view
    return View(viewModel);
}

[HttpPost]
public ActionResult Update(MyEntityViewModel model)
{
    if (!ModelState.IsValid)
    {
        // validation failed => redisplay view so that the user can fix the errors
        return View(model);
    }

    // fetch the domain entity that needs to be edited:
    SomeEntity entityToEdit = db.GetEntity(model.ID);

    // update only the properties that were part of the view model,
    // leaving the others intact
    Mapper.Map<MyEntityViewModel, SomeEntity>(model, entityToEdit);

    // persist the domain model
    db.Update(entityToEdit);

    // we are done   
    return RedirectToAction("Success");
}
于 2012-08-28T06:55:13.637 に答える