Asp.net mvc 使用viewbag将列表返回到强类型视图

Asp.net mvc 使用viewbag将列表返回到强类型视图,asp.net-mvc,razor,viewbag,Asp.net Mvc,Razor,Viewbag,我正在尝试使用viewbag将客户列表返回到强类型视图,由于我是MVC和Razor的新手,我遇到了一些困难,有谁能就以下问题提供一些建议吗 我的控制器中有以下代码 public ViewResult Index() { var q = from a in db.Customers select a; ViewBag.customer = q; return View(db.CustomerSites.ToList());

我正在尝试使用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>
}
但是这会产生一个错误,说“Customer”类型不包含Customer name的定义,但它包含如下所示的定义,所以我不确定为什么会发生错误

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; }
    }
}
当我输入@customer时。它只允许我访问两个列表,而不允许访问列表中的单个属性

我想我可以用@customer.CustomerSites.UnitNo这样做

但我能去的最远的地方是@customer.CustomerSites


你知道我做错了什么吗?

q
不是一个客户,而是一系列客户。因此,当您说
ViewBag.customer=q
,则
ViewBag.customer
属性变为类型
IEnumerable
,很自然地,它没有
CustomerName
属性。

q
不是一个客户,而是一系列客户。因此,当您说
ViewBag.customer=q
,则
ViewBag.customer
属性变为
IEnumerable
类型,很自然地,它没有
CustomerName
属性。

我认为您可以将其改进一点。 首先-创建一个名为ViewModel的新类。将其添加到“模型”文件夹中,称之为ex.CustomerSitesViewModel.cs

在其中,添加一个

public IEnumerable Customers {get;set;} public IEnumerable CustomerSites {get;set;} 公共IEnumerable客户{get;set;} 公共IEnumerable自定义项{get;set;} 或者,您可以创建一个ViewModel CustomerSiteViewModel.cs,其中包含

public Customer CustomerDetails {get;set;} public CustomerSite CustomerSiteDetails {get;set;} 公共客户客户详细信息{get;set;} 公共CustomerSite CustomerSiteDetails{get;set;} 您可以将字段命名为Customer和CustomerSite,但我并不是为了演示而这样做的,这样您就不会陷入一个递归循环中,不知道要调用哪一个

那么您的视图(查看一个)是

@模型CustomerViewModel 或者如果你需要一份清单

@model IEnumerable @模型IEnumerable
这是相对于ViewBag数据的首选方式。它是强类型的。更容易理解,也更不容易出错。

我想你可以把它做得更好一些。 首先-创建一个名为ViewModel的新类。将其添加到“模型”文件夹中,称之为ex.CustomerSitesViewModel.cs

在其中,添加一个

public IEnumerable Customers {get;set;} public IEnumerable CustomerSites {get;set;} 公共IEnumerable客户{get;set;} 公共IEnumerable自定义项{get;set;} 或者,您可以创建一个ViewModel CustomerSiteViewModel.cs,其中包含

public Customer CustomerDetails {get;set;} public CustomerSite CustomerSiteDetails {get;set;} 公共客户客户详细信息{get;set;} 公共CustomerSite CustomerSiteDetails{get;set;} 您可以将字段命名为Customer和CustomerSite,但我并不是为了演示而这样做的,这样您就不会陷入一个递归循环中,不知道要调用哪一个

那么您的视图(查看一个)是

@模型CustomerViewModel 或者如果你需要一份清单

@model IEnumerable @模型IEnumerable
这是相对于ViewBag数据的首选方式。它是强类型的。更容易理解,也不容易出错。

谢谢您的回复,如果我选择了一个客户而不是一个客户列表,那么语法会起作用吗?我是否可以从customer表中提取一个客户名称列表,以包含在CustomerSites列表中?谢谢您的回复,因此,如果我选择一个客户而不是一个客户列表,那么语法会起作用吗?我是否可以从customer表中提取一个客户名称列表,将其包含在CustomerSites列表中? public Customer CustomerDetails {get;set;} public CustomerSite CustomerSiteDetails {get;set;} @model CustomerViewViewModel @model IEnumerable