asp.net mvc 2 - связывание моделей и списки выбора - PullRequest
2 голосов
/ 20 июля 2010

У меня есть следующий список выбора:

<select d="Owner_Id" name="Owner.Id">
    <option value="">[Select Owner]</option>
    <option value="1">Owner 1</option>
    <option value="2">Owner 2</option>
    <option value="3">Owner 3</option>
</select>

Это связано с:

public class Part
{
    // ...other part properties...
    public Owner Owner {get; set;}
}

public class Owner
{
    public int Id {get; set;}
    public string Name {get; set;}
}

Проблема, с которой я сталкиваюсь, заключается в том, что, если выбран параметр [Select Owner], выдается ошибка, потому что я связываю пустую строку с int. Поведение, которое я хочу, это пустая строка, которая приводит к нулевому свойству Owner в Part.

Есть ли способ изменить связыватель модели детали, чтобы получить такое поведение? Таким образом, при привязке свойства Owner к Part, если Owner.Id - пустая строка, просто возвращайте нулевого Owner. Я не могу изменить связыватель модели владельца, поскольку мне требуется поведение по умолчанию в его собственном контроллере (добавление / удаление владельцев).

1 Ответ

1 голос
/ 20 июля 2010

Вы можете попробовать привязку пользовательской модели:

public class PartBinder : DefaultModelBinder
{
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        if (propertyDescriptor.PropertyType == typeof(Owner))
        {
            var idResult = bindingContext.ValueProvider
                .GetValue(bindingContext.ModelName + ".Id");
            if (idResult == null || string.IsNullOrEmpty(idResult.AttemptedValue))
            {
                return null;
            }
        }
        return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
    }
}

А затем:

[HttpPost]
public ActionResult Index([ModelBinder(typeof(PartBinder))]Part part)
{
    return View();
}

или зарегистрировать ее глобально:

ModelBinders.Binders.Add(typeof(Part), new PartBinder());
...