场景:如何更新模型?
ASP MVC 6
我正在尝试更新模型。为了将模型信息传递给客户端(浏览器/应用程序),我使用的是DTO。
问题1:为了更新,我应该将整个对象发回去吗?
问题2:有没有办法可以轻松传递更新的信息?如果有,怎么样?
问题3:我可以使用JSON补丁进行更新吗?
答案 0 :(得分:1)
问题2:有没有办法可以轻松传递信息 更新了?如果是,怎么样?
是。您应该创建一个视图模型,该模型应该只包含视图所需的那些属性。
我们假设您的用例是构建一个允许用户仅编辑其姓氏的视图。
public class EditUserViewModel
{
public int Id {set;get;}
public string LastName {set;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)并使用jQuery post
方法将其发送到您的服务器。
$(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.
});
});
});
要阻止overposting,您可以在HttpPost操作方法上使用Bind
属性使用绑定白名单。但最安全的策略是使用与客户端允许发送的内容完全匹配的视图模型类。
答案 1 :(得分:0)
而不是这个
UpdateModel(model);
您现在可以调用此
await TryUpdateModelAsync(model);