2

部分的にしか編集されていないモデルに MVC を使用する最良の方法を見つけようとしています。

以下は簡単な例です。

モデル

using System.ComponentModel.DataAnnotations;
public class SimpleModel
{
    public int Id { get; set; }
    public string Parent { get; set; }
    [Required]
    public string Name { get; set; }
}

意見

using System.ComponentModel.DataAnnotations;
public class SimpleModel
{
    public int Id { get; set; }
    public string Parent { get; set; }
    [Required]
    public string Name { get; set; }
}

コントローラ

using System.Web.Mvc;

public class SimpleController : Controller
{
    public ActionResult Edit(int id)
    { return View(Get(id)); }

    [HttpPost]
    public ActionResult Edit(int id, SimpleModel model)
    {
        if (model.Name.StartsWith("Child")) //Some test that is not done client-side.
        {
            Save(model);
            //Get the saved data freshly.
            //model = Get(id);
        }
        else
        {
            ModelState.AddModelError("", "Name should start with 'Child'");
        }
        //Is this the way to set the Parent property?
        //var savedModel = Get(id);
        //model.Parent = savedModel.Parent;
        return View(model);
    }

    //Mock a database.
    SimpleModel savedModel;

    private void Save(SimpleModel model)
    { savedModel = new SimpleModel() { Id = model.Id, Name = model.Name }; }

    private SimpleModel Get(int id)
    {
        if (savedModel == null)
        { return new SimpleModel() { Id = id, Parent = "Father", Name = "Child " + id.ToString() }; }
        else
        { return new SimpleModel() { Id = savedModel.Id, Parent = "Father", Name = savedModel.Name }; }
    }
}

名前フィールドは編集可能です。Parent フィールドは参照用であり、更新しないでください。そのため、DisplayFor を使用してレンダリングされます。

投稿すると、Parent プロパティが null に設定されたモデルを受け取ります。保存されないので問題ありません。しかし、受け取ったモデルをそのままビューに戻すと、Parent フィールドが表示されなくなります。モデルが有効な場合は、データベースから簡単に取得できるため、Parent フィールドの値を取得できます。

モデルが有効でない場合、ユーザーが入力を修正してもう一度保存できるようにしたいと考えています。そこでは、入力された受信モデルの値を使用する必要がありますが、表示された値も表示する必要があります。

実際には、参照用に表示されるフィールドはさらに多くあり、ほとんどの場合、編集中のデータベース エンティティとは異なるデータベース エンティティからのものです。

フィールドをビューの非表示フィールドとして渡すという提案を見たことがありますが、クライアントから更新してはならないデータを読み取ることに非常に消極的です。

これらの値を手動でモデルにコピーしたり、隠しフィールドとして渡したりするよりも、これを行うためのよりエレガントな方法はありますか?

4

2 に答える 2

1

親フィールドを更新しない場合は、投稿時に更新しないため、それが非表示かどうかは問題ではありません。

この場合は非表示を使用しますが、そのフィールドを更新しないようにしてください。

于 2013-03-29T18:36:06.240 に答える
1

それらの編集不可能なプロパティを別のモデルに与えて、それらのプロパティを処理させるのはどうですか?

モデルを見る

public class PersonViewModel
{
    public int Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public PersonDetailsModel DetailsModel { get; set; }
}

詳細モデル

public class PersonDetailsModel
{
    public string Mother { get; set; }
    public string Father { get; set; }

    public PersonDetailsModel() { }

    public PersonDetailsModel(int personId)
    {
        // pull required model data from databases
        var db = DBParentContext;
        Mother = db.Parent.Where(m => m.ChildId == personId)
        Father = db.Parent.Where(m => m.ChildId == personId)
    }
}

コントローラ

public class PersonController : Controller
{
    [HttpPost]
    public ActionResult Edit(PersonViewModel viewModel)
    {
        viewModel.DetailsModel = new PersonDetailsModel(viewModel.Id)

        if (ModelState.IsValid) {
            // ~
        }
        return View(viewModel)
    }
}

意見

@model PersonViewModel

@Html.DisplayFor(m => m.DetailsModel.Mother)
@Html.DisplayFor(m => m.DetailsModel.Father)
@Html.TextBoxFor(m => m.FirstName)
@Html.TextBoxFor(m => m.LastName)

あなたの母親のような詳細は編集できないため、実際には「編集」モデルの一部ではありません。

于 2013-03-29T16:55:03.347 に答える