我正在使用 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();