【问题标题】:How to bind to one property of an existing collection of objects如何绑定到现有对象集合的一个属性
【发布时间】:2019-07-08 03:18:21
【问题描述】:

我正在创建一个 ASP.NET Core Razor Pages 应用程序。我有一组对象,这些对象已经设置了多个属性,其中一个属性需要设置。我不确定如何将输入绑定到该属性,同时保持其他属性的现有值。

我已经看到有关如何将模型绑定到复杂集合的资源,但我认为这种方法行不通,因为这似乎会创建对象类型的新实例,我希望能够做到这一点我现有的对象集合。编辑:https://www.learnrazorpages.com/razor-pages/model-binding

例如

List<MyObject> objectList;

class MyObject {
   public int propertyA { get; set; }
   public int propertyB { get; set; }
   public int propertyC { get; set; }
}

在上面示例的上下文中,我想将我的输入绑定到 objectList 集合,但我只想绑定到 propertyC(在其他某个时间点,所有这些对象的 propertyA 和 propertyB 已经建立)

【问题讨论】:

    标签: c# asp.net-core razor-pages


    【解决方案1】:

    这取决于您输入的名称;它需要采用CollectionProperty[N].PropertyC 的形式,其中N 是索引。假设您都绑定到 List&lt;MyObject&gt; 并将其用作视图的模型:

    @for (var i = 0; i < Model.Count; i++)
    {
        <input asp-for="@Model[i].PropertyC" />
    }
    

    对应的动作参数如下:

    public IActionResult Foo(List<MyObject> myObjects)
    

    但是,我认为您实际上正在努力解决的问题是您的“现有”收藏实际上并不存在。每个请求都是唯一的,唯一存在的东西是与该请求一起发送的东西。您最初使用一些事物集合填充视图的事实是无关紧要的。除非您发回该完整集合,否则它不再存在。

    不是你应该把它发回去。发布的任何内容都可能被修改,如果您不想修改 PropertyAPropertyB,则不应发布它们。那么,这让你何去何从?映射。

    您想要做的只是为所有项目发布PropertyC。然后,您可以获取完整填充的MyObject 实例列表,但您可以执行此操作(查询数据库等)。然后,您遍历一个或另一个列表,并将 PropertyC 的值映射到您完全填充的列表:

    for (var i = 0; i < existingMyObjects.Count; i++)
    {
        existingMyObjects[i].PropertyC = myObjects[i].PropertyC;
    }
    

    FWIW,您可能还想发布关联 ID 或类似信息。上述方法依赖于前后的收集顺序相同,这并不总是保证。

    【讨论】:

    • 谢谢,这成功了!我最终不需要使用关联 ID,但出于好奇,如果我不想让用户提供该 ID,这将如何工作?我可以提供我自己的数据与用户的输入一起发布吗?
    • 您可以使用隐藏输入,但它仍然必须是表单的一部分并与其他所有内容一起发布。这确实意味着用户可以使用浏览器中的开发人员工具更改 id,如果他们真的想要的话,但是你无能为力。一般来说,在这种特殊情况下,这应该不是什么大问题,因为在这里伪造 id 几乎没有什么好处。
    【解决方案2】:

    您可以使用 foreach 将数据绑定到 propertyC,如下所示:

    foreach (var item in objectList)
    {
        item.propertyC = 50; //Bind the value that you want
    }
    

    【讨论】:

    • 对不起,我应该指定输入来自 html 表单。因此,当发送发布请求时,我只想自动绑定到 propertyC。与此类似:learnrazorpages.com/razor-pages/model-binding
    • @user9997229:是的!没关系。永远欢迎你,我的朋友:D
    猜你喜欢
    • 2014-04-06
    • 2020-06-22
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多