2013-04-05 2 views
0

У меня есть страница, на которой пользователи могут вводить информацию о состоянии, а затем список других пользователей возвращается в состояние. Я использую цикл foreach.MVC 3 принимает null foreach в viewModel

В некоторых штатах есть 0 пользователей, что приводит меня к ошибке: Ссылка на объект не установлена ​​в экземпляр объекта. Как я могу пройти мимо этой ошибки? Определенная модель, которую я использую, называется Profiles.

Модель:

public class homepage 
{ 
    public List<profile> profile { get; set; } 
    public PagedList.IPagedList<Article> article { get; set; } 
} 

Контроллер:

public ActionResult Index() 
{ 
    HttpCookie mypreference = Request.Cookies["cook"]; 
    if (mypreference == null) 
    { 
     ViewData["mypreference"] = "Enter your zipcode above to get more detailed information"; 
     var tyi = (from s in db.profiles.OrderByDescending(s => s.profileID).Take(5) select s).ToList(); 
    } 
    else 
    { 
     ViewData["mypreference"] = mypreference["name"]; 
     string se = (string)ViewData["mypreference"]; 
     var tyi = (from s in db.profiles.OrderByDescending(s => s.profileID).Take(5) where se==s.state select s).ToList(); 
    } 
    return View(); 
} 

The View:

@if (Model.profile != null) 
{ 
foreach (var item in Model.profile) 
{ 
    @item.city 
} 
} 

Когда я получаю ссылку на объект не указывает на экземпляр объекта ошибка, линия @if (Model.profile != null) подсвечена, поэтому я попробовал для этого:

public List<profile>? profile { get; set; } 

Но это не сработало. Любые идеи о том, как принять пустую модель в foreach или просто пропустить код во время выполнения?

ответ

0

Профиль - это список. Посмотрите, есть ли в списке какие-либо элементы.

Смотрите, если это работает:

@if (Model.profile.Any()) 
{ 
    foreach (var item in Model.profile) 
    {  
     @item.city 
    } 
} 
+1

Цикл foreach не должен вылетать, если список пуст; он должен просто петли 0 раз. Это скорее похоже на то, что сама модель равна null, учитывая ошибку и код нечетного контроллера. –

1

Просто заметил, что вы звоните View() но не передавая его модель, то в представлении вы ссылаетесь Model.profile. Неизбежно Model имеет значение null и поэтому не имеет свойства profile для доступа. Убедитесь, что вы передаете модель в вид в вызове return View(model).


Последующая для коллекций

Я всегда считал, что в любое время у вас есть переменная, которая реализует IEnumerable<T>, то лучше, чтобы заполнить его с пустым множеством над значением null. То есть:

// no-nos (IMHO) 
IEnumerable<String> names = null; // this will break most kinds of 
            // access reliant on names being populated 
            // e.g. LINQ extensions 

// better options: 
IEnumerable<String> names = new String[0]; 
IEnumerable<String> names = Enumerable.Empty<String>(); 
IEnumerable<String> names = new List<String>(); 

Если вы не любите проверять if (variable != null && variables.Count() > 0) каждый раз, когда вы хотите получить доступ к нему, сделать его пустую коллекцию и оставить его в этом.

Чтобы получить полный круг, до тех пор, пока переменная заполнена какой-либо коллекцией (пустой или заполненной), foreach не должен прерываться. он просто пропустит блок кода и ничего не выводит. Если вы получаете ошибку объекта null, это, скорее всего, потому, что переменная пуста и перечислитель не может быть восстановлен.

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