Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 模型绑定器中的模型绑定_Asp.net Mvc_Modelbinders_Modelbinder - Fatal编程技术网

Asp.net mvc 模型绑定器中的模型绑定

Asp.net mvc 模型绑定器中的模型绑定,asp.net-mvc,modelbinders,modelbinder,Asp.net Mvc,Modelbinders,Modelbinder,首先,请容忍我。我有一个自定义模型绑定器,它成功地将表单数据映射到自定义对象。在此模型绑定器中,它还将表单项映射到不同的自定义对象。我觉得我应该能够做的是创建一个单独的模型绑定器来处理第二个映射。这是一个简化版本 自定义对象: public class Category { public int CategoryId { get; set; } public string Name { get; set; } public string Status { get; set

首先,请容忍我。我有一个自定义模型绑定器,它成功地将表单数据映射到自定义对象。在此模型绑定器中,它还将表单项映射到不同的自定义对象。我觉得我应该能够做的是创建一个单独的模型绑定器来处理第二个映射。这是一个简化版本

自定义对象:

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    public string Description { get; set; }
    public IEnumerable<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Status { get; set; }
}
公共类类别
{
public int CategoryId{get;set;}
公共字符串名称{get;set;}
公共字符串状态{get;set;}
公共字符串说明{get;set;}
公共IEnumerable子类别{get;set;}
}
公共类子类别
{
public int CategoryId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字符串状态{get;set;}
}
如果我的表单为子类别传回了一堆ID,我需要做的就是运行到数据存储库并创建子类别对象。从表格中,将以以下格式提交子类别列表:

<input type="text" name="Name" value="This Category" />

<input type="hidden" name="subcat.Index" value="0" />
<select name="subcat[0].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="1" />
<select name="subcat[1].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="2" />
<select name="subcat[2].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

某物
别的
某物
别的
某物
别的
编写一个定制来映射类别显然很简单,编写模型绑定器(在模型绑定器中,我将运行一个查询我的数据存储库)进而映射子类别证明有点困难


我不知道我说得有多清楚,抱歉,谢谢你的阅读,请让我知道,如果有什么我可以说得更清楚

我的看法是,模型绑定器应该构建表示模型,而不是从存储库中构建实体类型。模型绑定器应该是从表单的键/值集合到表示模型的非常简单的映射,表示模型主要是标量值,可能与其他类型(主要是标量值或列表)有一些关系。正如您所发现的,必须从存储库中具体化实体实例会增加很多复杂性

而且,这是不必要的。使用表示模型有很多优点,包括:

  • 不需要将允许用户更新的字段列为白名单,因为表示模型只包含这些字段
  • 默认的模型绑定器将适用于除最复杂的模型绑定场景之外的所有场景。在实践中,我发现只有当用户看到的值必须以有条件的方式绑定到其他值时,我才需要使用自定义模型绑定器。使用演示模型时,演示模型的结构应与页面的结构相匹配,因此不需要出于结构原因使用自定义模型活页夹
  • 您将能够在创建数据库或实体模型之前创建视图和控制器。这意味着您可以在完成大量创建最终系统的工作之前让客户认可您的设计。这有助于在实体模型中的结构问题发生之前对其进行排序。只需创建一个与您认为客户希望看到的页面相匹配的演示模型,使用该演示模型的一个组合实例构建页面的总体轮廓,并将其显示给客户即可。如果他们满意,那么您可以构建存储库/实体模型,并编写LINQ查询将其映射到您的表示模型

因此,在您的示例中,子类别将作为整数列表从表单集合中输入。因此,表示模型应该具有相同的整数列表。在控制器中,绑定后,您可以调用一个方法将模型值从表示模型传输到存储库中的物化类别实例。

我的看法是,模型绑定器应该构建表示模型,而不是从存储库中构建实体类型。模型绑定器应该是从表单的键/值集合到表示模型的非常简单的映射,表示模型主要是标量值,可能与其他类型(主要是标量值或列表)有一些关系。正如您所发现的,必须从存储库中具体化实体实例会增加很多复杂性

而且,这是不必要的。使用表示模型有很多优点,包括:

  • 不需要将允许用户更新的字段列为白名单,因为表示模型只包含这些字段
  • 默认的模型绑定器将适用于除最复杂的模型绑定场景之外的所有场景。在实践中,我发现只有当用户看到的值必须以有条件的方式绑定到其他值时,我才需要使用自定义模型绑定器。使用演示模型时,演示模型的结构应与页面的结构相匹配,因此不需要出于结构原因使用自定义模型活页夹
  • 您将能够在创建数据库或实体模型之前创建视图和控制器。这意味着您可以在完成大量创建最终系统的工作之前让客户认可您的设计。这有助于在实体模型中的结构问题发生之前对其进行排序。只需创建一个与您认为客户希望看到的页面相匹配的演示模型,使用该演示模型的一个组合实例构建页面的总体轮廓,并将其显示给客户即可。如果他们满意,那么您可以构建存储库/实体模型,并编写LINQ查询将其映射到您的表示模型

因此,在您的示例中,子类别将作为整数列表从表单集合中输入。因此,表示模型应该具有相同的整数列表。在控制器中,绑定后,您可以调用一个方法将模型值从表示模型传输到存储库中的物化类别实例。

我建议您看看这个,它给出了另一种方法的示例。使用