ASP.NET MVC ViewModel update



我有一个详细信息页面,可以编辑与特定项目相关的信息。

    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,则应该从操作方法中删除该参数。

要更新您感兴趣的字段,您应该:

  1. 让方法采用一个不同的视图模型,该模型只包括应该更新的字段
  2. 更改表单,以便只有您想要更新的字段位于HTML.TextBoxFor()方法创建的文本框(或其他可更新控件)中

最新更新