2017-01-21 2 views
-1

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

public class Student 
{ 
    public int Id { get; set; } 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 
    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 
    public ICollection<WorkExperience> WorkExperiences { get; set; } 
    public ICollection<Education> Educations { get; set; } 
    public ICollection<Skill> Skills { get; set; } 
} 

public class Employer 
{ 
    public int Id { get; set; } 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 
    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 
    public ICollection<WorkExperience> WorkExperiences { get; set; } 
    public ICollection<Education> Educations { get; set; } 
    public ICollection<Skill> Skills { get; set; } 
} 

public class WorkExperience 
{ 
    public int Id { get; set; } 
    [Display(Name = "Company Name")] 
    public string CompanyName { get; set; } 
    [Display(Name = "Job Title")] 
    public string JobTitle { get; set; } 
    [Display(Name = "Experience (in years)")] 
    public string Experience { get; set; } 
    [Display(Description = "Enter City, Country for e.g. San Francisco, California")] 
    public string Location { get; set; } 
    public virtual ICollection<Employer> Employers { get; set; } 
    [Display(Name = "Set as Current Company")] 
    public virtual ICollection<Student> Students { get; set; } 
} 

Я хочу каждого студента & работодателя иметь несколько workexperiences каждый. Таким образом, у stuent может быть любое количество опыта &, даже у работодателя может быть любое число. Проблема, с которой я сталкиваюсь, заключается в том, где, когда она достигает кода работы, в нем говорится:

Значение не может быть пустым. Имя параметра: источник

Однако, я получаю все значения в представлении после прохождения IEnumerable модели студента

Ниже приводится точка зрения кода

@model IEnumerable<OpenOpportunity.Models.Student> 
@foreach (var student in Model) 
{ 
    <div class="row clearfix"> 
     <div class="col-xs-12"> 
      <h1> 
      @student.FirstName @student.LastName 
      </h1> 
     </div> 
    </div> 

    var count = 0; 
    if (@student.WorkExperiences == null) 
    { 
     <small>No current position & company set</small> 
     <a id="currentDetails" href="@Url.Action("EditCurrentDetails", "Main", new { area = "Students", id = student.Id })"> 
     <i class="fa fa-edit"></i> 
     </a> 
    } 
    else if (@student.WorkExperiences.Count() > 0) 
    { 

     foreach (var work in student.WorkExperiences) 
     { 
      if (work.IsCurrentCompany == true) 
      { 
       <small>@work.JobTitle,@work.CompanyName</small> 
       <a id="currentDetails" href="@Url.Action("EditCurrentDetails", "Main", new { area = "Students", id = student.Id })"> 
       <i class="fa fa-edit"></i> 
       </a> 
      } 
      else 
      { 
       count++; 
      } 
     } 
    } 
    if (@student.WorkExperiences.Count() == count) 
    { 
     <small>No current position & company set</small> 
     <a id="currentDetails" href="@Url.Action("EditCurrentDetails", "Main", new { area = "Students", id = student.Id })"> 
     <i class="fa fa-edit"></i> 
     </a> 
    } 
} 

А вот код контроллера:

var userID = db.Users.Find(User.Identity.GetUserId()); 
       var getStudentDetails = (from x in db.Students.Include("WorkExperiences") 
             where x.Id == userID.Student.Id 
             select x).ToList(); 
       return View(getStudentDetails); 

Кроме того, я хотел бы сказать вам мнение работодателя работает отлично & это представление с тем же кодом. Не определены ли отношения? или что-то другое?

+0

Что строка коды бросает это исключение? –

+0

В вашем коде есть синтаксические ошибки. Символ '@' в ваших операциях if должен быть таким: '@if (...)' not 'if (@ ...)' – CodingYoshi

+0

@CodingYoshi, это не синтаксическая ошибка, и она должна быть 'if (...) '-' @if (...) 'будет генерировать исключение (' @ 'перед' student' просто бессмысленно) –

ответ

0

Глядя на ваш код, вот упрощенный пример вашего потока:

var count = 0; 
if (@student.WorkExperiences == null) 
{ 
    <small>No current position & company set</small> 
    ... 
} 
else if (@student.WorkExperiences.Count() > 0) 
{ 
    foreach (var work in student.WorkExperiences) 
    ... 
} 
if (@student.WorkExperiences.Count() == count) 
{ 
    <small>No current position & company set</small> 
    ... 
} 

Смотрите эту проблему? Если коллекция WorkExperiences имеет значение NULL, то вы вызываете .Count() на нее в последнем if, не делая нулевой чек раньше.

Я полагаю, что это последнее if утверждения плохого пережиток, что вы должны просто удалить, чтобы ваш поток становится так:

var count = 0; 
if (student.WorkExperiences == null || !student.WorkExperiences.Any()) 
{ 
    <small>No current position & company set</small> 
    ... 
} 
else 
{ 
    foreach (var work in student.WorkExperiences) 
    ... 
} 
+0

Спасибо, но теперь код работает, я все еще не понимаю, что заставило его работать, потому что это был тот же код, что и раньше. Единственное, что я заметил, было при отладке, если первое значение ключа, которое вы получаете в коллекции, равно null, оно будет выбрасываться, даже если вы не получаете доступ к значению в этой точке цикла. Но теперь я упрощу свой цикл, чтобы он выглядел аккуратным. – user359460

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