问题 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)并使用 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.
});
});
});
阻止过度张贴 http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx,您可以使用绑定白名单Bind
HttpPost 操作方法上的属性。但最安全的策略是使用与允许客户端发送的内容完全匹配的视图模型类。