Возврат списка в строго типизированный вид с помощью viewbag - PullRequest
1 голос
/ 06 мая 2011

Я пытаюсь вернуть список клиентов в строго типизированное представление, используя viewbag, и у меня возникли некоторые трудности, так как я новичок в MVC и Razor. Может ли кто-нибудь любезно дать совет по следующей проблеме, пожалуйста?

У меня есть следующий код в моем контроллере,

  public ViewResult Index()
    {
        var q = from a in db.Customers
        select a;
        ViewBag.customer = q;
        return View(db.CustomerSites.ToList());
    }

и этот код на мой взгляд

@foreach (var customer in Model)
{
<tr>
 <td>
        @ViewBag.customer.CustomerName
   <td>
   <td>
        @customer.UnitNo
    </td>
    <td>
        @Truncate(customer.StreetName, 25)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=customer.Id }) |
        @Html.ActionLink("Details", "Details", new { id=customer.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id=customer.Id })
    </td>
   </tr>
}

Итак, я получаю список клиентов и сайтов клиентов, сайты набраны

@model IEnumerable<trsDatabase.Models.CustomerSite>

Я пытаюсь извлечь CustomerName из списка клиентов, используя

@ViewBag.customer.CustomerName

Но это приводит к ошибке, говорящей, что тип "Customer" не содержит определения дляимя клиента, но оно соответствует указанному ниже, поэтому я не уверен, почему происходит ошибка.

namespace trsDatabase.Models
{
    public class Customer
    {

        [ScaffoldColumn(false)]
        public int Id { get; set; }
        [StringLength(50), Required(ErrorMessage = "Customer name required, please enter a customer name")]
        public string CustomerName { get; set; }
        [DisplayName("Contact Name")]
        [StringLength(50), Required(ErrorMessage = "Primary contact name required, please enter a contact name")]
        public string PrimaryContactName { get; set; }
        [DisplayName("Secondary Contact")]
        public string SecondaryContactName { get; set; }
        [DisplayName("Email")]
        [StringLength(50), Required(ErrorMessage = "Primary email address is required please enter an email address")]
        public string PrimaryEmailAddress { get; set; }
        [DisplayName("Secondary Email")]
        public string SecondaryEmailAddress { get; set; }
        [ScaffoldColumn(false)]
        public DateTime RegisteredDate { get; set; }
        [DisplayName("Contact No")]
        public string PrimaryContactNo { get; set; }
        [DisplayName("Secondary Contact No")]
        public string SecondaryContactNo { get; set; }
        [DisplayName("Waste Carrier Ref")]
        public string WasteCarrierRef { get; set; }
        [DisplayName("Unit No")]
        public string UnitNo { get; set; }
        [DisplayName("Street Name")]
        [StringLength(50), Required(ErrorMessage = "Street name required, please enter a street name ")]
        public string StreetName { get; set; }
        [StringLength(50), Required(ErrorMessage = "Town required, please enter a town")]
        public string Town { get; set; }
        [StringLength(50), Required(ErrorMessage = "County is required, please enter a county")]
        public string County { get; set; }
        [StringLength(10), Required(ErrorMessage = "Postcode is required, please enter a postcode")]
        public string Postcode { get; set; }
        public List<CustomerSite> CustomerSites { get; set; }
    }
}

Обновление:

Я все еще не могу получить это, чтобы сделать то, что мне нужно, я создалмодель основного вида, которая включает

public IEnumerable <Customer> SomeCustomer { get; set; }
public IEnumerable <CustomerSite> CustomerSites { get; set; }

Тогда, на мой взгляд,

@model IEnumerable<trsDatabase.Models.masterViewModel>

Если я попытаюсь получить доступ к модели, набрав, используя для каждого

@foreach (var customer in Model)

Когда я набираю @customer.Это позволит мне получить доступ только к двум спискам, а не к отдельным свойствам в списке.

Я думал, что смогу сделать это, например, с помощью @ customer.CustomerSites.UnitNo

Но самый дальнийЯ могу пойти, это @ customer.CustomerSites

У вас есть какие-либо идеи о том, что я делаю здесь неправильно?

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Я думаю, вы можете сделать это немного лучше.Сначала - создайте новый класс с именем ViewModel.Добавьте это в папку с вашими моделями.CustomerSitesViewModel.cs

В нем добавьте определение для

public IEnumerable Customers {get;set;}
public IEnumerable CustomerSites {get;set;}

Или вы можете создать ViewModel CustomerSiteViewModel.cs, который содержит

public Customer CustomerDetails {get;set;}
public CustomerSite CustomerSiteDetails {get;set;}

Вы можете назвать поляCustomer и CustomerSite, но я не делал этого для демонстрационных целей, чтобы вы не застряли в рекурсивном цикле, не понимая, какой из них вызывать.

Тогда ваше представление (для просмотра одного) равно

@model CustomerViewViewModel

или если вам нужен список

@model IEnumerable

Это предпочтительный способ по сравнению с данными ViewBag.Это сильно напечатано.легче следовать и меньше подвержено ошибкам.

0 голосов
/ 06 мая 2011

q не клиент, а последовательность клиентов.Поэтому, когда вы говорите ViewBag.customer = q;, свойство ViewBag.customer становится типа IEnumerable<Customer>, что, естественно, не имеет свойства CustomerName.

...