Привязка Model к DropDownListFor со значением Int64 - PullRequest
0 голосов
/ 09 ноября 2011

В моих моделях у меня есть ссылка внешнего ключа 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 из базы данных. Во всяком случае, это много хитрости для чего-то, что кажется простым!

1 Ответ

1 голос
/ 10 ноября 2011

Как я и подозревал, изучение моделей и классов LookupKey помогло решить проблему. У меня было несколько подобных случаев, когда второй взгляд на класс показал, что я не использую правильное свойство модели.

Когда вы изменили свой DropDownListFor для использования model.LookupKey.LookupCategory.ID, это синхронизировалось с правильным свойством и альтом!

Поздравляю с обнаружением проблемы.

...