MVC 5删除/排除返回模型的某些部分

时间:2014-09-11 07:30:41

标签: c# asp.net-mvc

我有很多[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等,我不想在响应中返回。

那么......是否有一种简单的方法可以排除/仅包含对象的某些部分?或者我是否必须创建一个新对象并仅分配我想要返回的值?

1 个答案:

答案 0 :(得分:0)

解决此类问题的常用方法是创建用于表示视图所需数据的视图模型。然后使用AutomapperValue injector之类的东西来构建域模型和视图模型之间的映射(这会删除大量繁琐的代码)。这种方法也可以帮助您避免Over-Posting / mass assignment attacks