Выпадающий список MVC не отображается на модель - PullRequest
4 голосов
/ 18 февраля 2011

Я пытаюсь разработать приложение в MVC 3, используя EF codefirst. Когда я использую свойства int и соглашение для установки отношений внешнего ключа, например,

public class Patient  
{         
     public int ConsultantId {get;set;}
}

Затем я настраиваю страницу создания и редактирования и использую помощник HTML.DropDownListFor для создания списка возможных консультантов

 @Html.DropDownListFor(model => model.ConsultantId, ((IEnumerable<Web.Models.Consultant>)ViewBag.PossibleConsultants).Select(option
    => new SelectListItem
    {
        Text = Html.DisplayTextFor(_ => option.ConsultantName).ToString(),
        Value
            = option.ConsultantId.ToString(),
        Selected = (Model != null) && (option.ConsultantId
            == Model.ConsultantId)
    }), "Choose...")

Что отлично работает, но теперь я хочу перейти к наличию объекта «Консультант» в классе пациента, например,

 public class Patient  
    {
         public virtual Consultant Consultant {get;set;}
    }

    public class Consultant {
         public virtual ICollection<Patient> Patient {get;set;}
}

Я сейчас пытаюсь настроить представление, используя DropDownListfor, но на этот раз для модели. Консультант, например,

  @Html.DropDownListFor(model => model.Consultant, ((IEnumerable<Web.Models.Consultant>)ViewBag.PossibleConsultants).Select(option
=> new SelectListItem
{
    Text = Html.DisplayTextFor(_ => option.ConsultantName).ToString(),
    Value
        = option.ConsultantId.ToString(),
    Selected = (Model != null) && (option.ConsultantId
        == Model.Consultant.ConsultantId)
}), "Choose...")

Страница создания и редактирования загружается правильно, и консультант правильно выбирается на странице редактирования, но когда я публикую страницу, ModelState имеет недействительное значение при этой ошибке "Не удается преобразовать
'System.String' для ввода 'Web.Models.Consultant ". Кто-нибудь знает, как использовать DropDownListFor, чтобы модель можно было сопоставить обратно с объектом.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Я нашел решение, которое работает для меня. Используя подходящий код codefirst, вы можете иметь как общедоступное свойство int ConsultantId, так и общедоступное свойство виртуального консультанта в одном классе. В базе данных по-прежнему существует только одна связь, которая определяется свойством ConsultantId. Так что, если это int обнуляемое, отношения будут необязательными.

1 голос
/ 18 февраля 2011

Значение выбора из раскрывающегося списка (ConsultantId) связывается со свойством Консультанта в модели, имеющего тип Консультант.

Не могли бы вы вместо этого связать значение раскрывающегося списка с Consultant.ConsultantId?

Пример:

@Html.DropDownListFor(model => model.Consultant.ConsultantId, // the rest of the statement goes here...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...