ASP.NET 模型绑定器忽略绑定(排除)和绑定(包括),并将 List<> 设置为 null

本文关键字:绑定 List 并将 设置 null 包括 NET 排除 ASP 模型 | 更新日期: 2023-09-27 18:34:44

我对 ASP.NET 模型绑定器和(实体框架延迟加载(或忽略表单字段有问题...

重要事项

型号 Category

[Table("Category")]
public class Category
{
    public Category()
    {
        SellingRange = new Range();
        Products = new HashSet<Product>();
    }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    [Required, StringLength(100)]
    public string Name { get; set; }
    public Range SellingRange { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

型号Product

[Table("Product")]
public class Product
{
    public Product()
    {
        Categories = new HashSet<Category>();
    }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    [Required(ErrorMessage = "Name is required")]
    [StringLength(255, ErrorMessage = "Max length of name is 255.")]
    public string Name { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
}

型号Range

public class Range
{
    public DateTime? Opening { get; set; }
    public DateTime? Closure { get; set; }
}

控制器后操作:

[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(Category category, [Bind(Prefix = "SellingRange")] Range sellingRange, Guid[] products)
{
    category.SellingRange = sellingRange;
    // [...] ***********************************************************************************
}

从 html 表单提交数据:

Id=dd1e055d-f851-4880-a88a-cfa01e8b2cd6
Name=Test
SellingRange.Opening=01.12.2014
SellingRange.Closure=24.12.2014
products=79174475-5640-45ac-bb88-c983c4de5324
products=6fc64b68-e5f3-4ca3-9cf7-56237b16561a

视图:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Category>" %>
<%@ Import Namespace="stackoverflow.test" %>
<script type="text/javascript">
    $(function () {
        $('#products').tagsInput({ autocomplete_url: '<%= Url.Action("ProductsAC") %>' });
    });
</script>
<%= Html.HiddenFor(model => model.Id) %>
<%= Html.DisplayFor(model => model.Name) %>:<br />
<%= Html.TextBoxFor(model=> model.Name) %><br />    
<br />  
<%= Html.DisplayFor(model => model.Products) %>:<br />
<input name="products" id="products" value="<%= String.Join(",", Model.Products.Select(product => product.Name).toArray() %>" /><br />
<br />
<%= Html.DisplayFor(model => model.SellingRange.Opening) %>:<br />
<%= Html.JQueryUI().DatepickerFor(model => model.SellingRange.Opening).ToHtmlString() %><br />
<br />
<%= Html.DisplayFor(model => model.SellingRange.Closure) %>:<br />
<%= Html.JQueryUI().DatepickerFor(model => model.SellingRange.Closure).ToHtmlString() %>

顶视图:

using (Html.BeginForm("Edit", "Category", FormMethod.Post))
{
    %><% Html.RenderPartial("CategoryForm", Model); %><%
}

问题:

实体框架未在上面的 ****** 处加载类别产品。(在 [...]之后((在控制器中(默认情况下,"产品"应为new HashSet<Product>();。但是模型活页夹使它们null.我试图在Category category前面添加[Bind(Exclude="products")].-> 不工作!然后我试图包括所有重要的东西......在Category category前面添加[Bind(Include="Id,Name")]。不行!

是否可以直接从仅包含产品 GUID 的 post 数组中添加ICollection<Products>?那就太好了!:)

或者如何解决问题?我需要原始产品的完整产品列表。像... DbContext.Categories.Find(category.Id).Products不是空的;)

我不知道为什么模型活页夹不能排除/包含产品并让它们成为new HashSet<Product>();。为什么模型绑定器必须将产品设置为 null?

在调试模式下,控制器中的category变量是类别的代理类,它已完全加载(我认为(,除了产品...

为什么我拆分类别和产品

因为我检查了原始产品的产品,并且在检查后添加了 Guid[] 列表的产品。在那里,我可以从数据库中加载产品并将产品添加到列表中。例如,您可以查看销售范围。销售范围是我添加的,因为模型活页夹无法将具有两个DateTime?ComplexType绑定到范围类,所以我手动执行此操作。

这适用于sellingRange...因为我不需要原来的销售范围...而且因为我不需要它们,所以它可能为空...但产品不应该!

提前感谢!

ASP.NET 模型绑定器忽略绑定(排除)和绑定(包括),并将 List<> 设置为 null

问题是深度嵌套的 DefaultModelBinder...我不知道有没有。

我有一个有效的文档,项目的模型绑定器用 null 覆盖所有内容。

自定义模型绑定器会忽略 [绑定(排除(] 并包含!因为我有很多问题。

谢谢@Stephen穆克。现在,绑定在一个参数^^下正常工作我优化了自定义模型绑定器:)

相关文章: