ASP.NET MVC - Custom Model Binder для идентификационных полей
-
30-09-2019 - |
Вопрос
У меня есть следующие объекты:
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; }
}
Сейчас в моем представлении «Добавить», у меня есть текстовое поле для входа в раздел, например:
<%= Html.TextBoxFor(m => m.Section.SectionID) %>
Я хотел бы создать пользовательскую модель Binder, чтобы иметь следующую логику:
Если клавиша модели заканчивается идентификатором и имеет значение (значение было вставлено в TextBox), затем установите родительский объект (раздел в этом примере) в раздел. MetsByID (значение введенное) еще установить родительский объект на NULL.
Я бы очень ценил помощь здесь, так как это сбивает меня на некоторое время. Спасибо
Решение 2
Используя решение, размещенное Дейвом Тибен, я придумал следующее:
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);
}
}
Это работает красиво, однако он не выбирает правильное значение, когда форма публикуется обратно и с использованием выпадающего списка. Я вижу почему, но до сих пор мои попытки исправить это было напрасно. Я был бы признателен в это еще раз, если бы вы могли помочь.
Другие советы
Я разместил модельный связующий на этот вопрос Это использует ирпозиторию для заполнения внешних ключей, если они присутствуют. Вы можете изменить его, чтобы удовлетворить вашу цель лучше.