【问题标题】:Is it possible to useModel Binding to update an object when not all form values are present?当并非所有表单值都存在时,是否可以使用模型绑定来更新对象?
【发布时间】:2011-07-13 09:25:26
【问题描述】:

我正在实现一些基本的模型绑定来填充传递给动作的对象(正常使用)。第一个 Action 是 CREATE 方法,在这种情况下,我要求所有参数都存在。

对于这个其他动作,然而它只是一个 UPDATE 方法,在这种情况下,我将接受所有表单值,但我也希望它可以只接收一个或少数几个,从而只更新指定的字段。

我相信当没有值存在时,我必须以某种方式让它们默认为 null 或 ""。但是,我的印象是模型绑定要求所有参数都在 POST 中,以便解析采用该对象的操作。

这是否可能并且我使用相同的模型对象来实现它,还是我需要制作“完整版”和“部分版”?

编辑:试图让这一点更清楚:

现在如果我有这个动作:

公共 ActionResult MyAction(MyObject obj)

MyObject 对象有 3 个变量:var1、var2 和 var3

如果我 POST 到 MyAction 并且只包含 var1 和 var2,它将无法解析,因为模型绑定没有找到 var3

但是,我希望它以这种方式工作!这样,如果有人只想发布 var1(连同一些 ID),我可以在数据库中查找对象并更新对象的 var1,而单独留下 var2 和 var3,我只是想弄清楚如何获取模型绑定当表单值丢失时正确解决。

【问题讨论】:

  • 你的问题对我来说毫无意义。也许如果你展示一些代码,它会变得更容易理解。
  • @DarinDimitrov 添加了更多细节
  • 您希望它解决什么问题? var3 没有在请求中发送,因此模型绑定器将其解析为可能的最佳值:null。我看不出你有什么问题?
  • @DarinDimitrov 这正是我希望它的行为方式,但是当我尝试时,我实际上得到“没有为此对象定义无参数构造函数。”
  • 您为哪个对象获得了此异常? MyObject?如果是这种情况,您有两种可能性:1. 添加一个默认构造函数(无论如何,这对您的视图模型来说都是很好的做法)或 2. 为 MyObject 类型编写一个自定义模型绑定器。

标签: asp.net-mvc model-binding


【解决方案1】:

您可以使用Bind 属性将您希望发布的属性列入白名单。这将告诉模型绑定器仅绑定您指定的字段。

public ActionResult MyAction([Bind(Include = "Field3,Field4")MyObject myObject)

更新字段子集的正常情况是从完全填写的数据库中获取 MyObject,并使用要更新的字段白名单的重载调用 UpdateModel。

[HttpPost]    
public ActionResult MyAction()
{
    var myObject = GetMyObjectFromDatabase();
    TryUpdateModel(myObject, string.Empty /* prefix */, "Field3,Field4");
    // myObject now has Field3 and Field4 values from the POST
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2012-11-11
    • 2021-12-11
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多