2015-01-15 3 views
0

У меня есть следующий тип, который я использую, чтобы расширить другой тип, который используется на протяжении всей нашей системы:Моя модель Razor равна нулю на сообщение

public class SystemUser : User 
    { 
     public int? RoleId 
     { 
      get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
      set { RoleId = value; } 
     } 

     public Role _Role 
     { 
      get { return (Role)RoleId; } 
      set { RoleId = (int)value; } 
     } 

     public SelectListItem[] RolesList { get; set; } 

     public bool IsA(params Role[] roles) 
     { 
      return new List<Role>(roles).Any(v => v.Equals(_Role)); 
     } 

     public bool IsNotA(params Role[] roles) 
     { 
      return !(new List<Role>(roles).Any(v => v.Equals(_Role))); 
     } 
    } 

Я в основном с помощью этого типа, чтобы действовать в качестве контейнера для данных из нашей базы данных и передачи их от контроллера к нашему представлению в виде @model. Представление Получает заселение просто отлично, но после того, как я модифицирую модель с помощью полей @ Html.LabelFor() и перейдя эти данные на контроллер, который мы используем для сохранения обновленных данных в базе данных, модель равна нулю. Если я пройду через POST, я получаю исключение NullReferenceException на получателе ROleId в моем классе SystemUser. Обратите внимание на свойство _Role; Известно, что если свойство класса имеет то же имя, что и его Тип, модель будет отправляться пустым в контроллер, но я уже исправил это.

Это мясо Вид:

@model SystemUser 
@using (Html.BeginForm("Usr", "Mr", FormMethod.Post, new {@autocomplete="off"})) 
    { 
     //Fields removed for sake of simplifying stackoverflow post 

     <input class="button green-bg" type="submit" value="Save" /> 
     <input class="button gray-bg" type="button" onclick="location.href='@Url.Action("View", "Mr")'" value="Cancel" /> 
    } 

Любая помощь здесь будет весьма признателен.

+3

шоу полей, а также и действие контроллера, а –

+0

только полей для хелперов (за исключением дисплея и этикетки) привязаны к модели.убедитесь, что поля, которые вы хотите вернуть, находятся в одном –

+0

. Как выглядит ваш контроллер? Имеет ли метод с тем же именем, что и [Usr], и метод, украшенный атрибутом [HttpPost]? И действительно ли контроллер назван [Mr]? – ajawad987

ответ

3

Пока вы заполняете модель контроллера, чтобы создать представление, вы получаете модель EF (по внешнему виду вашего кода) , включая дочерние отношения.

Вид будет опубликован просто обратно свойствами, соответствующими именованным элементам ввода на странице.

Поскольку Relationhip является сборкой на стороне сервера, это свойство будет null внутри действия post. Пост-действие получает простую версию класса (отношения внешних ключей не заполняются).

Если вам это нужно, внутри контроллера вам необходимо повторно заполнить это свойство (например, исходя из значения идентификатора обратной линии).

Если вы показать код контроллера и базовый класс User я тоже могу быть в состоянии предложить конкретные изменения, чтобы работать вокруг этого :)

Обход:

Обеспечить испытание свойств геттера если коллекция присутствует:

public int? RoleId 
    { 
     get { return this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
     set { RoleId = value; } 
    } 

Дополнительно:

Я также немного обеспокоен тем, что, поскольку нет поля, поддерживающего свойство RoleId, так что set { RoleId = value; } на самом деле является рекурсивным. Вы можете проверить это.

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

public int? RoleId 
    { 
     get { return this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id();} 
    } 

или, если это деяние как кэшированное местное значение для базы данных, добавить частное поле назад свойство с:

private int? roleId; 
    public int? RoleId 
    { 
     get 
     { 
      return (roleId = roleId.GetValueOrDefault(this.Relationhip == null ? null : this.Relationhip.FirstOrDefault().TypeList.FirstOrDefault().Id())); 
     } 
     set { roleId = value; } 
    } 
+0

Ahh. Это имеет большой смысл. Итак, я поставил точку останова в начале моего метода POST, и, прежде чем он попадет, я получаю это исключение NullReferenceException на получателе свойства RoleId. Мой вопрос: что пытается получить доступ к этому свойству, прежде чем я даже вступлю в метод POST? – Killingsworth

+0

Автомобиль, вероятно, смотрит на все публичные объекты. Просто прочитав это свойство, он терпит неудачу. На данный момент я добавлю обходной путь к примеру. –

+0

Прохладный. Я бы определенно оценил это! – Killingsworth

Смежные вопросы