我有一个详细信息页面,可以编辑与特定项目相关的信息。
public ActionResult Details(int id)
{
Call call = db.Calls.Find(id);
return View(new CallFormViewModel(call));
}
我使用一个视图模型——
public class CallFormViewModel
{
public Call Call { get; private set; }
public CallFormViewModel()
{
Call = new Call();
}
public CallFormViewModel(Call call)
{
Call = call;
}
}
提交时,我希望只允许更新"call"对象的某些属性。我的邮件处理方法如下-
[HttpPost]
public ActionResult Details(CallFormViewModel callForm)
{
(some code removed for clarity)
UpdateModel(callForm.Call ,new string[] {
"Contact",
"Summary",
"Description",
}
}
问题是,在我调用UpdateModel之前,callForm已经用表单提交中的所有输入进行了更新。
如何更改此设置并使用UpdateModel选择性地更新字段?
感谢
编辑:
我想我一直在错误地看待这个问题。我应该做的是:
[HttpPost]
public ActionResult Details(int id, CallFormViewModel callForm)
{
var call = db.Calls.Find(id);
(some code removed for clarity)
UpdateModel(call, "Call", new string[] {
"Contact",
"Summary",
"Description",
}
}
通过这种方式,它获取了不完整的数据[并且只获取了我想要的字段],并将其应用于实际模型。我一直混淆了实际模型对象的callForm.Call,而实际上它只是它的一个表示。
必须等到我开始上班才能检验这个理论。
在Action
参数中写入ViewModel
时,Model Binder
将ViewModel属性绑定到"传入"数据。这应该有效:
[HttpPost]
public ActionResult Details()
{
CallFormViewModel callForm = new CallFormViewModel();
UpdateModel(callForm.Call ,new string[] {
"Contact",
"Summary",
"Description",
}
}
更新:
绑定属性选项:
[Bind(Include = "Contact,Summary,Description")]
public class CallFormViewModel
{
// As before...
}
您不需要调用UpdateModel,因为您将获得一个更新的模型作为参数传递给您的方法。如果您更喜欢使用UpdateModel,则应该从操作方法中删除该参数。
要更新您感兴趣的字段,您应该:
- 让方法采用一个不同的视图模型,该模型只包括应该更新的字段
- 更改表单,以便只有您想要更新的字段位于HTML.TextBoxFor()方法创建的文本框(或其他可更新控件)中