ASP.NET MVC - пользовательский связыватель модели для полей идентификаторов - PullRequest
2 голосов
/ 03 сентября 2010

У меня есть следующие объекты:

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) %>

Я бы хотел создать пользовательский механизм связывания модели, чтобы иметь следующую логику:

Если ключ модели заканчивается идентификатором и имеет значение (значение было вставлено в текстовое поле), тогда установите для родительского объекта (в данном примере Раздел) значение Section.GetById (введенное значение), иначе установите для родительского объекта значение null.

Я бы очень признателен за помощь, так как это меня некоторое время сбивало с толку. Спасибо

Ответы [ 2 ]

2 голосов
/ 03 сентября 2010

Я разместил связыватель модели на этом вопросе , который использует IRepository для заполнения внешних ключей, если они присутствуют.Вы можете изменить его в соответствии с вашими целями.

1 голос
/ 04 сентября 2010

Используя решение, опубликованное Дэйвом Тибеном, я придумал следующее:

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

Это работает хорошо, однако не выбирает правильное значение, когда форма отправляется обратно и использует раскрывающийся список. Я могу понять, почему, но до сих пор мои попытки исправить это были напрасны. Буду признателен, если вы поможете.

...