NullReferenceException и просмотр свойств навигации модели - PullRequest
0 голосов
/ 05 марта 2011

Я изо всех сил пытаюсь найти способ справиться с нулевыми значениями в моей модели представления. Некоторые из этих значений являются вложенными объектами или объектами навигации в моей модели. Как мне избежать, чтобы в моем представлении была пустая ошибка ссылки, не вводя логику в представление? Это кажется легким, но это конец дня.

У меня есть модель вида с некоторыми навигационными свойствами, такими как:

ViewModel.cs

public class ViewModel
{
  public ViewModel () {}
  public ViewModel (Contact contact, IDemographicService demographicService)
         : this()
  {
    Id = contact.Id;
    Name = contact.Name;
    EthnicityId = contact.EthnicityId;
    if(EthnicityId > 0 || EthnicityId != null)
       Ethnicity = deomographicService.GetEthnicityById((int)contact.EthnicityId);
  }
  public int Id {get;set;}
  public string Name {get;set;}
  public int? EthnicityId {get;set;}
  public Ethnicity Ethnicity {get;set;}
}

Я пропущу контроллер, потому что это не главное в моем вопросе. (Я знаю, что логика может идти в контроллере, но я решил поместить его во ViewModel).

MyView.cshtml

@model ViewModel
<ul>
<li>@Model.Name</li>
<li>@Model.Ethnicity.Name</>//This is the null reference.
</ul>

Полагаю, я мог бы определить только строку «EthnicityName» (и если null возвращает null) вместо целого объекта, но есть случаи, когда мне нужно более одного свойства из объекта Ethnicity. Это исключает этническую принадлежность, независимо от того, находится ли она в модели представления, контроллере или представлении. Короче говоря, что мне делать с null.null? Тупик. Спасибо.

Ответы [ 3 ]

1 голос
/ 05 марта 2011

Кажется, это проблема дизайна класса, а не проблема View / Model. У вас есть класс, который объявляет, что он будет предоставлять этничность как часть своего неизменного состояния при инициализации. Однако, когда вы на самом деле создаете объект, вы не даете такую ​​гарантию потребителям класса. Я думаю, что решение @John Saunders является жизнеспособным, но я бы больше хотел создать экземпляр экземпляра Ethnicity по умолчанию в качестве статического члена типа Ethnicity и вернуть его. Свойство Name этого значения по умолчанию будет возвращать соответствующий язык для ответа «None Supplied» или что-то подобное.

1 голос
/ 05 марта 2011

Я не думаю, что ужасно добавлять «логику» для понимания нулевых значений.Такая логика является частью базовой объектной модели .NET;это не бизнес-логика.

Тем не менее, вы можете добавить одно свойство в модель для каждого свойства типа Ethnicity, которое вы хотите видеть в модели:

public Ethnicity Ethnicity {get;set;}
public string EthnicityName {
    get {return Ethnicity == null ? String.Empty : Ethnicity.Name;}
    set {if (Ethnicity != null) {Ethnicity.Name = value;}}
}
public int EthnicityCode {
    get {return Ethnicity == null ? 0 : Ethnicity.Code;}
    set {if (Ethnicity != null) {Ethnicity.Code = value;}}
}

Затем представлениене имеет никакой работы вообще.

Обратите внимание, что я думаю, что такого рода делегирование в порядке, в отличие от форматирования.Я бы никогда не добавил в модель свойство, предназначенное только для форматирования.

0 голосов
/ 11 апреля 2011

Возможно, вас заинтересует реализация интерфейса IDataErrorInfo на вашем ViewModel, поэтому здесь будет реализована логика проверки вместо права на свойства getter / setters.

...