私は ASP.NET MVC3 を使用しており、いくつかのプロパティを持つビュー モデルを持っています。その一部はユーザーに表示するためのもので、一部はユーザーからの入力として使用され、既定値を持つ場合があります。GET リクエスト (唯一のパラメーターは何を取得するかの識別子です) と、ビュー モデル全体をアクションのパラメーターとして受け取る投稿に対して、同じビュー モデルを使用しています。私のコントローラーは、NHibernate セッションからエンティティーをプルするビジネス・ロジック・レイヤーを介して取得されたエンティティーをビュー・モデルに取り込みます。
すべての読み取り専用フィールドの非表示の入力をビューに配置して、無効なビューモデルを使用して投稿した後にページがレンダリングされた場合にそれらが表示されるようにする方が良いですか、それともユーザーが実際に使用する入力のみを使用する方が良いですか?データを提供し、残りのバックエンドをリロードしてマージしますか?
ありがとう!
編集:
なぜ?
編集:
コントローラーは通常、次のようになります。
public class MyController : BaseController /* BaseController provide BizLogic object */
{
[HttpGet]
public ActionResult EditSomething(Int32 id)
{
MyDomainObject = base.BizLogic.GetMyDomainObjectById(id);
MyViewModel model = new MyViewModel();
model.Id = id;
model.ReadOnly1 = MyDomainObject.Field1;
model.Readonly2 = MyDomainObject.Field2;
model.UserInput3 = MyDomainObject.Field3;
model.UserInput4 = MyDomainObject.Field4;
return View(model);
}
[HttpPost]
public ActionResult EditSomethingMyViewModel model)
{
PerformComplexValidationNotDoneByAttributes(model);
if (ModelState.Valid)
{
BizLogicSaveTransferObject transferObject =
new BizLogicSaveTransferObject();
transferObject.Id = model.Id;
transferObject.Field3 = model.UserInput3;
transferObject.Field4 = model.UserInput4;
base.BizLogic.SaveDomainObject(transferObject);
return RedirectToAction("EditSomething", new { id = model.Id });
}
else
{
#if reload_non_input_fields_from_db
MyDomainObject = base.BizLogic.GetMyDomainObjectById(model.Id);
model.ReadOnly1 = MyDomainObject.Field1;
model.Readonly2 = MyDomainObject.Field2;
#endif
return View(model);
}
}
}
ビューは次のようになります。
# Html.BeginForm();
${Html.ValidationSummary()}
<p>ID: ${Model.Id}</p><input type="hidden" name="${Html.NameFor(m => m.Id)}" value="${Model.Id" />
<p>Read Only One: ${Model.ReadOnly1}</p><!-- uncomment if not reload_non_input_fields_from_db <input type="hidden" name="${Html.NameFor(m => m.ReadOnly1)}" value="${Model.ReadOnly1}" />-->
<p>Read Only Two: ${Model.ReadOnly2}</p><!-- uncomment if not reload_non_input_fields_from_db <input type="hidden" name="${Html.NameFor(m => m.ReadOnly2)}" value="${Model.ReadOnly2}" />-->
<p>Input Three: ${Model.UserInput3}</p><input type="hidden" name="${Html.NameFor(m => m.UserInput3)}" value="${Model.UserInput3}" />
<p>Input Three: ${Model.UserInput4}</p><input type="hidden" name="${Html.NameFor(m => m.UserInput3)}" value="${Model.UserInput4}" />
# Html.EndForm();