2012-02-02 2 views
1

Привязка модели к виду.MVC3 Binding model (некоторые поля) на вид

моя модель Person имеет {Id, название, адрес и т.д.) ...

В моем контроллере я хочу получить некоторые поля например:

var model = from p in db.Person where p.jobtype == 1 
      select new Person { Title = p.Title, Address = p.Address}; 
return View(model); 

также пытался использовать анонимный тип и он не работает:

var model = from p in db.Person where p.jobtype == 1 
      select new { p.Title, p.Address}; 
return View(model); 

На мой взгляд:

@model IEnumerable<Demo.Models.Person> 
@foreach (var item in Model) { 
<div>@item.Title</div>} >FAILS 

Если я получаю полный объект, то он работает, как я могу получить некоторые поля с использованием анонимного типа или \ и с помощью моей модели .... plz предоставляет правильный синтаксис. Thanks

+0

Значит ли 'от р в Person' работать? – MatteKarla

+0

обновлен. db.Person будет работать, но не получается на вид – Ben

+1

Пожалуйста, сделайте себе одолжение и не используйте модели данных в качестве моделей просмотра. Создайте ViewModel для вашего представления, а затем заполните его моделью данных. –

ответ

1

Если в вашем представлении у Модели должно быть Enumerable, тогда это должно быть AsEnumerable в вашем заявлении на выбор.

var model = (from p in db.Person 
      where p.jobtype == 1 
      select p).AsEnumerable(); 

return View(model); 

, а затем

@model IEnumerable<Demo.Models.Person> 

@foreach (var item in Model.ToList()) { 
<div>@item.Title</div>} 

В качестве альтернативы, так как вы просто нужен список в конце дня, и вы «должны» быть с помощью ViewModel, я предлагаю следующее.

ViewModel

public class PersonViewModel 
{ 
    public int Name { get; set; } 
    public string Title { get; set; } 
} 

Контроллер

var person = (from p in db.Person 
      where p.jobtype == 1 
      select p); 

PersonViewModel model = Mapper.Map<Person, PersonViewModel>(person); 

return View(model.ToList()); 

Посмотреть

@model List<Demo.ViewModels.PersonViewModel> 

@foreach (var item in Model) { 
<div>@item.Title</div>} 

Примечание: я использовал AutoMapper в приведенном выше примере
У меня нет моей IDE передо мной, поэтому я не уверен, что это прекрасно.

+0

. Хотя я должен был создать только viewModel, если я хочу объединить несколько моделей в один и показать в представлении. Я использую 1 модель, и я хочу показать некоторые области этой модели ... мне все еще нужно создать viewModel? – Ben

+0

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

+0

k Возможно ли создать анонимный объект типа и передать этот объект в представление? или мое единственное решение - viewmodel? – Ben

-1

Я бы порекомендовал вам назвать ваши данные db.People или что-то в этом роде.

Вы должны использовать p.ID == 3 вместо p.ID = 3.

Если у вас есть желание выбрать только одного человека и показать, то используйте SingleOrDefault(), First(), FirstOrDefault(), чтобы получить только один человек.

var model = (from p in db.Person where p.ID == 3 
      select p.Title).First(); 

Тогда в вашей модели не использовать IEnumerable, просто используйте:

@model Demo.Models.Person 
     <div>@item.Title</div> 

EDIT: после обновленный вопрос содержит p.jobtype вместо р.ID для выбора нескольких Я бы рекомендовал использовать определенный ViewModel для данных, которые вы хотите выбрать. Если все вы хотите Название, то вы можете использовать

@model IEnumerable<string> 
@foreach (var title in Model) { 
<div>@title</div>} 

Но я бы рекомендовал использовать определенную ViewModel только с полями, которые требуют, например:

public class PersonViewModel 
{ 
    public int Name { get; set; } 
    public string Title { get; set; } 
} 

, а затем select new PersonViewModel {Name = p.Name, Title = p.Title } и, конечно, используйте эту модель на вид: @model IEnumerable<PersonViewModel>.

+0

Ему нужно, чтобы Person был 'Enumerable', поэтому' First' не работает. –

+0

Я ответил только на оригинал вопрос, попросил p.ID = 3, поэтому я думал, что ему нужен только один человек. В моем ответе говорится: «Если ваше намерение состоит в том, чтобы выбрать только одного человека ...», почему downvote? – MatteKarla

+0

Ах да, но есть еще доказательства в исходном вопросе, указывающие на 'Enumerable ', а также 'foreach', что' whe Ре "была бит, который был неуместен. –

0

Вы можете использовать .ToList():

List<person> model = (from p in db.Person 
         where p.jobtype == 1 
         select p).ToList(); 
return View(model); 

На ваш взгляд:

@model List<person> 
@foreach (var item in Model) { 
} 
+0

Ответ невозможен: 'p.jobtype = 1' должен быть' p.jobtype == 1' – MatteKarla

+1

Это не главное! Бен объясняет, что он работает, но не справляется с этим взглядом. – TwTw

+0

Благодарим вас за редактирование, Chase Florell! – TwTw