我有很多[HttpPost]方法将数据返回到我的视图。他们都看起来像这样:
[HttpPost]
public async Task<JsonResult> NewAction(Action model)
{
object[] data = new object[5];
if (ModelState.IsValid)
{
try
{
Case case = db.Cases.Find(model.Case_ID);
model.Created = db.Users.Find(User.Identity.GetUserId());
model.Created_date = DateTime.Now;
model.Active = true;
case.Actions.Add(model);
await db.SaveChangesAsync();
data[0] = true;
data[1] = "Action added!";
data[2] = model;
}
catch (Exception ex)
{
data[0] = false;
data[3] = ex.Message;
data[4] = ex.InnerException != null ? ex.InnerException.Message : "No details";
}
}
else
{
string errors = string.Join("<br/>", ModelState.Values
.SelectMany(x => x.Errors)
.Select(x => x.ErrorMessage));
data[0] = false;
data[3] = "<b>Invalid input data</b>";
data[4] = errors;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
所以我在这里返回data [2]对象中的模型,这样我就可以从中提取数据并将其放入我的表中。问题是我必须返回Created对象以获取Users Firstname和LastName。但问题是Created对象是一个ApplicationUser对象,所以这也包括IdentityUser中的字段,如PasswordHash,SecurityStamp等,我不想在响应中返回。
那么......是否有一种简单的方法可以排除/仅包含对象的某些部分?或者我是否必须创建一个新对象并仅分配我想要返回的值?
答案 0 :(得分:0)
解决此类问题的常用方法是创建用于表示视图所需数据的视图模型。然后使用Automapper或Value injector之类的东西来构建域模型和视图模型之间的映射(这会删除大量繁琐的代码)。这种方法也可以帮助您避免Over-Posting / mass assignment attacks。