我对 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
...因为我不需要原来的销售范围...而且因为我不需要它们,所以它可能为空...但产品不应该!
提前感谢!
问题是深度嵌套的 DefaultModelBinder...我不知道有没有。
我有一个有效的文档,项目的模型绑定器用 null 覆盖所有内容。
自定义模型绑定器会忽略 [绑定(排除(] 并包含!因为我有很多问题。
谢谢@Stephen穆克。现在,绑定在一个参数^^下正常工作我优化了自定义模型绑定器:)