DropdownListFor - исключение нулевой ссылки на модели страницы - PullRequest
0 голосов
/ 03 марта 2011

Я пытаюсь сохранить одну из моих моделей в базе данных. С учетом моделей:

public class Foo {
     public int Id { get; set; }
     public string Name { get; set; }
     public virtual Bar Something { get; set; }
}

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

public class FooPageModel {
    public Foo F { get; set; }
    public List<SelectListItem> Bars { get; set; }
}

В моем контроллере у меня есть:

public ActionResult Add(){
     var bars = ... // get all bars from db context
     var barsList = new List<SelectListItem>();
     barsList.AddRange(bars.Select(b => new SelectListItem {
          Text = b.Name,
          Value = b.Name
     }));

     var model = new FooPageModel
     {
          Bars = barsList
     };
     return View("Add", model);
 }

Теперь для представления (строго типизировано в FooPageModel):

<%: Html.DropdownListFor(f => f.F.Bar, Model.Bars) %>

Представление отображается хорошо, со значениями, которые я ожидаю, но когда я отправляю форму страницы, я получаю исключение NullReferenceException (на строке представления, вставленной выше, до того, как действие на контроллере будет когда-либо достигнуто). Я подумал, может быть, если я изменил код моего контроллера на:

var model = new FooPageModel
{
     F = new Foo(),
     Bars = barsList
}

Однако и это не помогает. Я полагаю, что я мог бы переписать FooPageModel, чтобы он представлял собой просто список строк информации, которую я хочу, но кажется избыточным дублировать логику модели; Я довольно новичок в CTP, так что, может быть, так оно и есть?

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

1 Ответ

0 голосов
/ 03 марта 2011

Вы не показываете код, в котором вы возвращаете ActionResult, но вам нужно убедиться, что вы передаете модель в представление, как это:

public ActionResult Add() {
    ...

    return View(model);  // send the model to the view
}
...