2013-10-03 2 views
0

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

Так что вопрос:

У меня есть View, который получает Model, который имеет следующую структуру:

public class MyViewModel 
{ 
    public string Title { get; set; } 
    public string Subtitle { get; set; } 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
    public string Property3 { get; set; } 

    public List<MyItem> ListOne { get; set; } 
    public List<MyItem> ListTwo { get; set; } 
    public List<MyItem> ListThree { get; set; } 
    public List<MyItem> ListFour { get; set; } 
    public List<MyItem> ListFive { get; set; } 
} 

Я хочу View, чтобы показать первый элемент из каждой List только тогда, когда в списке есть записи в нем. Так что я пытаюсь сделать на View сейчас что-то вроде этого:

<div> 
    @if(Model.ListOne != null) 
    { 
     <img src="@Html.DisplayFor(model => Model.ListOne.First().Filename)" style="max-height: 800px;max-width:800px; padding-bottom: 5px;" /> 
    } 
</div> 

, но когда я запускаю код, я получаю сообщение об ошибке с указанием System.InvalidOperationException: Sequence contains no elements. Таким образом, я понимаю, что представление сначала полностью отображается, и после этого анализируется код внутри и преобразован в окончательный вывод HTML (как это работает?) Может также использовать некоторые пояснения здесь)

Итак, что является лучшим способом для этого? Вы теряете гибкость при использовании MVC? Прямо сейчас, похоже. Это было бы намного проще, если бы ваш код «смешивался» с HTML. Не поймите меня неправильно, мне очень ясно, что преимущества, связанные с использованием шаблонов проектирования, приносят разработчику, но для этой конкретной проблемы мне действительно интересно узнать, насколько это гибко.

ответ

1

Razor is рендеринг этого в один проход с точки зрения вашей модели, и вы можете свободно смешивать код с HTML - вот что делает его таким потрясающим!

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

Попробуйте изменить это:

@if(Model.ListOne != null) 

к этому:

@if(Model.ListOne.Any()) 

На данный момент вы только проверяете, что Model.ListOne не null - т.е. не отформатирована в какой-то момент в вашей модели через ListOne=new List<MyItem>() или что-то подобное - но что вы действительно необходимо проверить, является ли Model.ListOneпустым или нет.

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

+0

Делает полный смысл! Свойство не будет равно нулю, потому что я всегда инициализирую его в контроллере. Я не знал о методе Any(), спасибо Стивен. Также благодарим вас за разъяснение способа визуализации кода. Если это позволяет мне смешивать код с HTML, то я предполагаю, что гибкость не скомпрометирована настолько, насколько я думал! Еще раз спасибо! – fobia

+1

Только мои два цента на этом. Следует попытаться сделать ViewModel максимально приближенным к его потреблению в представлении.Если в представлении всегда отображается первый элемент из этих списков, возможно, вам стоит вернуться к ViewModel и просто иметь в них отдельные объекты (а не списки). – bazz

+0

@Bazz да полностью согласен - гораздо чище иметь то, что вам нужно в представлении, готовом к работе, и свести logix к минимуму - указало бы это и на ответ, но не захотело мутить вода! –

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