Модель привязки MVC3 (некоторые поля) к представлению - PullRequest
1 голос
/ 03 февраля 2012

Привязка модели к виду.

у моей модели Person есть {Id, Title, Address ... etc)

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

 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 предоставит правильный синтаксис. Спасибо

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

Если ваше представление требует, чтобы модель была 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 голосов
/ 03 февраля 2012

Вы можете использовать .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 голосов
/ 03 февраля 2012

Я бы порекомендовал вам назвать ваши данные 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>

РЕДАКТИРОВАТЬ: после того, как вы обновили вопрос, чтобы он содержал p.jobtype вместо p.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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...