【发布时间】:2014-11-05 01:22:48
【问题描述】:
我有很多 [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 对象来获取用户名和姓氏。但问题是 Created 对象是一个 ApplicationUser 对象,因此它还包括来自 IdentityUser 的字段,例如 PasswordHash、SecurityStamp 等,我不想在响应中返回这些字段。
那么.. 有没有一种简单的方法可以仅排除/包含对象的某些部分?还是我必须创建一个新对象并只分配我想要返回的值?
【问题讨论】:
-
您最好创建一个仅代表您要显示/编辑的属性的视图模型,但您也可以使用BindAttribute.Exclude 属性
-
你应该避免使用像
case这样的特殊名称作为变量! -
嗯,没错。虽然会为新/编辑/删除而使用 ViewModel,但我认为我最喜欢它 :)
-
是的,实际上,我只是为了演示目的重命名了它;)
-
嗯,我得到的唯一问题是我必须创建一个新的 Action 对象,因为现在我发送的模型与数据库中的 Action 模型不匹配,所以我不能只添加模型到数据库..所以我必须将动作中的所有字段设置为等于模型中的字段... :(
标签: c# asp.net-mvc