3

场景:如何更新模型?

ASP MVC 6

我正在尝试更新模型。为了将模型信息传递给客户端(浏览器/应用程序),我使用的是 DTO。

问题 1:为了更新,我应该将整个对象发布回来吗?

问题 2:有没有一种方法可以让我只传递更新的信息?如果是,如何?

问题 3:我可以使用 JSON Patch 进行更新吗?

4

2 回答 2

1

问题 2:有没有一种方法可以让我只传递更新的信息?如果是,如何?

是的。您应该创建一个视图模型,它应该只具有视图所需的那些属性。

假设您的用例是构建一个允许用户仅编辑其姓氏的视图。

public class EditUserViewModel
{
  public int Id {set;get;}
  public string LastName {set;get;}
}

在你的 Get

public ActionResult Edit(int id)
{
  var user = yourUserRepository.GetUser(id);
  if(user!=null)
  {
   var v = new EditUserViewModel { Id=id,LastName=user.LastName};
   return View(v);
  }
  return View("NotFound");
}

和视图

@model EditUserViewModel
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>S.LastName)
  @Html.HiddenFor(s=>s.Id)
  <input type="submit" id="saveBtn" />
}

和你的 HttpPost 动作

[HttpPost]
public ActionResult Edit(EditUserViewModel model)
{
   // Since you know you want to update the LastName only, 
   // read model.LastName and use that
   var existingUser = yourUserRepository.GetUser(model.Id);
   existingUser.LastName = model.LastName;
   yourUserRepository.Save();
   // TO DO:  redirect to success page
}

假设yourUserRepository是您的数据访问类抽象的对象。

问题 1:为了更新,我应该将整个对象发布回来吗?

取决于您想从最终用户那里得到什么。使用这种视图模型方法,它只会发布 Id 和 LastName,这就是我们的用例。

我可以使用 JSON Patch 进行更新吗?

由于您只发送需要更新的数据(部分数据),所以应该没问题。

如果您愿意,您可以简单地序列化您的表单数据(只有 Id 和 LastName)并使用 jQuerypost方法将其发送到您的服务器。

$(function(){

  $("#saveBtn").click(function(e){

    e.preventDefault(); //prevent default form submit

    var _form=$(this).closest("form");
    $.post(_form.attr("action"),_form.serialize(),function(res){
      //do something with the response.
    });

  });

});

为防止过度发布Bind,您可以在 HttpPost 操作方法上使用属性绑定白名单。但最安全的策略是使用与允许客户端发送的内容完全匹配的视图模型类。

于 2015-12-07T03:38:20.080 回答
0

而不是这个

UpdateModel(model);

你现在可以调用这个

await TryUpdateModelAsync(model);
于 2016-03-12T02:23:57.517 回答