我有以下实体:
public class Category
{
public virtual int CategoryID { get; set; }
[Required(ErrorMessage = "Section is required")]
public virtual Section Section { get; set; }
[Required(ErrorMessage = "Category Name is required")]
public virtual string CategoryName { get; set; }
}
public class Section
{
public virtual int SectionID { get; set; }
public virtual string SectionName { get; set; }
}
现在在我的添加类别视图中,我有一个文本框来输入SectionID,例如:
<%= Html.TextBoxFor(m => m.Section.SectionID) %>
我想创建一个自定义模型绑定器,以具有以下逻辑:
如果模型键以ID结尾并且有一个值(一个值插入到文本框中),则将父对象(本例中的Section)设置为Section.GetById(输入的值),否则将父对象设置为null。
我非常感谢这里的帮助,因为这让我困惑了一段时间。感谢
答案 0 :(得分:2)
我在this question上发布了一个模型绑定器,它使用IRepository来填充外键(如果它们存在)。你可以修改它以更好地适应你的目的。
答案 1 :(得分:1)
使用dave thieben发布的解决方案,我想出了以下内容:
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (bindingContext.ModelType.Namespace.EndsWith("Models.Entities") && value != null && (Utilities.IsInteger(value.AttemptedValue) || value.AttemptedValue == ""))
{
if (value.AttemptedValue != "")
return Section.GetById(Convert.ToInt32(value.AttemptedValue));
else
return null;
}
else
return base.BindModel(controllerContext, bindingContext);
}
}
这很好用,但是当回发表单并使用下拉列表时,它不会选择正确的值。我明白为什么,但到目前为止,我试图修复它的努力都是徒劳的。如果你能提供帮助,我会再次感激。