【问题标题】:MVC 5 Delete/Exclude certain parts of return modelMVC 5删除/排除返回模型的某些部分
【发布时间】: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


【解决方案1】:

解决此类问题的一种流行方法是创建用于表示视图所需数据的视图模型。然后使用Automapper 或Value injector 之类的东西在域模型和视图模型之间进行映射(这消除了很多繁琐的代码)。这种方法还可以帮助您避免Over-Posting / mass assignment attacks。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    相关资源
    最近更新 更多