具有Int64值的ModelBinding到DropDownListFor

时间:2011-11-09 16:17:41

标签: asp.net-mvc-3 model-binding

在我的模型中,我有一个对LookupCategory的BIGINT(long / int64)外键引用。在View中,我有一个DropDownListFor如下:

@Html.DropDownListFor(model => model.LookupKey.LookupCategory, new SelectList(Model.LookupCategories, "ID", "Name"))

创建/编辑视图显示正常,但在选择提交ModelBinder的项目时会抱怨“The value '1' is invalid.”,因为它是以字符串而不是长字形式读取它。

有没有办法在不触及模型的情况下解决这个问题?我不想仅仅为解决这个小问题而实施ModelBinder,但如果必须的话,我已经草拟了这个:< / p>

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已经完成了它的工作,而不是很长,我需要实际的LookupCategory(其ID是long值)。我无法弄清楚如何再次使用默认模型绑定器来使用其默认行为从数据库中查找LookupCategory。无论如何,这对于看起来应该简单的事情来说是很多诡计!

1 个答案:

答案 0 :(得分:1)

我怀疑,检查模型和LookupKey类有助于解决问题。我有过这样的经历,第二次看这个课表明我没有使用正确的模型属性。

当您将DropDownListFor更改为使用model.LookupKey.LookupCategory.ID时,会使用正确的属性和中提琴同步!

恭喜发现问题。