В моих моделях у меня есть ссылка внешнего ключа BIGINT (long / int64) на LookupCategory. В представлении у меня есть DropDownListFor следующим образом:
@Html.DropDownListFor(model => model.LookupKey.LookupCategory, new SelectList(Model.LookupCategories, "ID", "Name"))
Представления создания / редактирования отображаются нормально, но при выборе элемента, отправляющего ModelBinder, жалуется "The value '1' is invalid.
", потому что он читает его как строку, а не как длинную.
Есть ли способ исправить это, не касаясь модели? Я бы предпочел не реализовывать ModelBinder просто для решения этой небольшой проблемы, но если я должен, у меня есть такой проект:
public class LookupKeyBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext,
System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
if (propertyDescriptor.PropertyType == typeof(LookupKey))
{
var modelState = bindingContext.ModelState[string.Format("{0}.{1}", propertyDescriptor.Name, "LookupCategory")];
propertyDescriptor.SetValue(bindingContext.Model, long.Parse(modelState.Value.AttemptedValue));
modelState.Errors.Clear();
return;
}
}
}
Это устроено так, потому что я хочу получить доступ к ModelState, а не знать имена полей формы (которые могут меняться между представлениями). Таким образом, я получаю длинное значение правильно, но проблема в том, что DefaultModelBinder уже выполнил свою работу, и вместо long мне нужна фактическая LookupCategory (чей ID является длинным значением). Я не могу понять, как снова использовать связыватель модели по умолчанию, чтобы использовать его поведение по умолчанию для поиска LookupCategory из базы данных. Во всяком случае, это много хитрости для чего-то, что кажется простым!