部分的にしか編集されていないモデルに 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 フィールドの値を取得できます。
モデルが有効でない場合、ユーザーが入力を修正してもう一度保存できるようにしたいと考えています。そこでは、入力された受信モデルの値を使用する必要がありますが、表示された値も表示する必要があります。
実際には、参照用に表示されるフィールドはさらに多くあり、ほとんどの場合、編集中のデータベース エンティティとは異なるデータベース エンティティからのものです。
フィールドをビューの非表示フィールドとして渡すという提案を見たことがありますが、クライアントから更新してはならないデータを読み取ることに非常に消極的です。
これらの値を手動でモデルにコピーしたり、隠しフィールドとして渡したりするよりも、これを行うためのよりエレガントな方法はありますか?