Asp.net mvc ASP.NET MVC-ID字段的自定义模型绑定器

Asp.net mvc ASP.NET MVC-ID字段的自定义模型绑定器,asp.net-mvc,modelbinders,model-binding,custom-model-binder,Asp.net Mvc,Modelbinders,Model Binding,Custom Model Binder,我拥有以下实体: 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")] pu

我拥有以下实体:

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) %>
m.Section.SectionID)%%>
我想创建一个自定义模型绑定器,使其具有以下逻辑:

如果模型键以ID结尾,并且有一个值(在文本框中插入了一个值),则将父对象(本例中为Section)设置为Section.GetById(输入的值),否则将父对象设置为null


我真的很感激这里的帮助,因为这让我困惑了一段时间。谢谢

我在上贴了一个模型活页夹,如果外键存在,它会使用IRepository来填充外键。您可以修改它以更好地满足您的目的。

使用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);
    }
}

这很好地工作,但是当表单发回并使用下拉列表时,它没有选择正确的值。我知道为什么,但到目前为止,我试图修复它的努力都是徒劳的。如果您能帮忙,我将再次感谢。

谢谢您的链接。到目前为止,它确实帮助了我。如果您能查看我尝试的解决方案并帮助完成它,我们将不胜感激:)。如果您仍在处理此问题,则在
If
语句中,您有
value.AttemptedValue==“”
然后在下一行有
value.AttemptedValue!=“”
,因此它似乎永远不会到达您的部分。GetById()代码。再次为您的建议干杯,但逻辑是正确的,尽管它可以进行一些整理以使其更具可读性。该问题的解决方案是创建一个自定义DropDownList,用于处理SelectItem的选定属性。希望他们能在下一版本的MVC中修复这个错误。我有一个自定义的模型绑定器,它试图对属性进行排序,以便始终首先绑定标识字段。我让实际的视图模型类——在它的属性设置器中——触发它自己的存储库加载,而不是让自定义绑定器来做。(在重新阅读您的O.P.之后,我意识到这并不完全合适,但是,也许会给其他人一个想法)