C# C MVC视图返回城市和州名称,而不是id

C# C MVC视图返回城市和州名称,而不是id,c#,model-view-controller,C#,Model View Controller,我在试图找出如何显示州和城市的名称而不是StateId和CityId时遇到了一些问题 我知道您可以在模型中放置州和城市的实例,如下所示: public virtual Cities Cities { get; set; } public virtual States States { get; set; } 然后将其添加到视图中: @Html.DisplayFor(modelItem => item.Cities.CityName) @Html.DisplayFor(modelI

我在试图找出如何显示州和城市的名称而不是StateId和CityId时遇到了一些问题

我知道您可以在模型中放置州和城市的实例,如下所示:

 public virtual Cities Cities { get; set; }
 public virtual States States { get; set; }
然后将其添加到视图中:

 @Html.DisplayFor(modelItem => item.Cities.CityName)
 @Html.DisplayFor(modelItem => item.States.StateName)
然而,我有一些事情不允许我这样做没有错误。 我使用的ViewModel提供了视图所需的内容。它依赖于Addresses表中的列表,在Addresses模型中,我为这些列表选择了一个列表,以便在编辑和创建时为每个列表填充一个下拉列表。 当我将这些添加到模型中并删除SelectList时,会出现一个错误,即找不到Cities\u CityId、States\u StateId列。 当我将其添加到viewModel时,它在视图中不可用。如果我只在显示一条记录时需要它,我可以使用它

Model.Cities.CityName
但我正在检索多个记录,如果它们存在的话,我相信,使用这些记录将显示所有记录的相同城市和州

我相信我所有的连接都是正确的,但可能遗漏了什么

以下是ViewModel:

public partial class AddressOverview 
{
    public static AddressOverview GetAddressByCompany(int id, GeneralEntities db)
    {
        var qCus = from ad in db.Addresses
                   join cn in db.CompanyNames on ad.CompanyId equals cn.CompanyId
                   join cit in db.Cities on ad.City equals cit.CityId
                   join st in db.States on ad.State equals st.StateId
                   where (ad.CompanyId == id)
                   select new AddressOverview()
                   {
                       AddressId = ad.AddressId,
                       Customer = cn.CompanyName,
                       Location = ad.LocationName,
                       Addresses = ad,
                       CompanyId = ad.CompanyId,
                       State = st.StateName,
                       City = cit.CityName
                   };


        var result = qCus.FirstOrDefault();

        if (result != null)
        {
            result.AddressDetail = db.Addresses.Where(a => a.CompanyId == result.CompanyId);

        };
        return result;
    }

    public int AddressId { get; set; }
    public string Customer { get; set; }
    public string Location { get; set; }
    public int CompanyId { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public virtual Addresses Addresses { get; set; }
    public virtual CompanyNames CompanyName { get; set; }
    public virtual Cities Cities { get; set; }
    public virtual States States { get; set; }
    public virtual IEnumerable<Addresses> AddressDetail { get; set; }
}
我想知道是否有一种方法可以使用modelInstance在控制器中实现这一点?请原谅我,我正在努力清理别人做的一些事情,我的技能有点弱。 如果你需要看别的东西,请告诉我。 谢谢你的帮助

更新: 我刚才头上挨了一巴掌。。从下面发布的问题看视图,我注意到我是从地址模型而不是视图模型调用它的。所以我纠正了,但仍然不起作用。。 由此更改:

@model MyProject.GenerDTO.Entities.Addresses
致:

更新: 这是我想出的解决办法。可能不是最好的,但肯定是一个快速解决方案

我决定在MSSQL端创建一个视图,并将所有这些结合在一起,然后在视图和ViewModel中使用它们。如果你决定做这样的事。确保它在实体中[未映射]。我们只是用它来查看,而不是用来编辑、创建等

以下是新的视图模型:

public partial class AddressOverview 
{
    public static AddressOverview GetAddressByCompany(int id, GeneralEntities db)
    {
        var qCus = from ad in db.AddressView
                   join cn in db.CompanyNames on ad.CompanyId equals cn.CompanyId
                   where (ad.CompanyId == id)
                   select new AddressOverview()
                   {
                       AddressId = ad.AddressId,
                       Customer = cn.CompanyName,
                       Location = ad.LocationName,
                       AddressView = ad,
                       CompanyId = ad.CompanyId
                       
                   };


        var result = qCus.FirstOrDefault();

        if (result != null)
        {
            result.AddressDetail = db.AddressView.Where(a => a.CompanyId == result.CompanyId);
        };
        return result;
    }

    public int AddressId { get; set; }
    public string Customer { get; set; }
    public string Location { get; set; }
    public int CompanyId { get; set; }
    public virtual AddressView AddressView { get; set; }
    public virtual CompanyNames CompanyName { get; set; }
    public virtual IEnumerable<AddressView> AddressDetail { get; set; }
}

我相信在SQL中创建视图是干净的,查询是在服务器端完成的。可以将其视为项目中的表。我对其他选择持开放态度。

您能显示应接收模型的视图的第一行吗?我发现您没有使用静态方法填充城市和州,因此如果您在视图中使用这些,您将有一个issue@Jed是的,我解释过了。我需要让它使用addresses表中的id,并从foreach中的City表填充相应的名称..你能显示应该接收模型的视图的第一行吗?我看到你没有在静态方法中填充城市和州,所以如果你在视图中使用这些,你将有一个issue@Jed是的,我他解释说。我需要让它使用addresses表中的id,并从foreach中的City表填充相应的名称。。
@model MyProject.Models.AddressOverview
public partial class AddressOverview 
{
    public static AddressOverview GetAddressByCompany(int id, GeneralEntities db)
    {
        var qCus = from ad in db.AddressView
                   join cn in db.CompanyNames on ad.CompanyId equals cn.CompanyId
                   where (ad.CompanyId == id)
                   select new AddressOverview()
                   {
                       AddressId = ad.AddressId,
                       Customer = cn.CompanyName,
                       Location = ad.LocationName,
                       AddressView = ad,
                       CompanyId = ad.CompanyId
                       
                   };


        var result = qCus.FirstOrDefault();

        if (result != null)
        {
            result.AddressDetail = db.AddressView.Where(a => a.CompanyId == result.CompanyId);
        };
        return result;
    }

    public int AddressId { get; set; }
    public string Customer { get; set; }
    public string Location { get; set; }
    public int CompanyId { get; set; }
    public virtual AddressView AddressView { get; set; }
    public virtual CompanyNames CompanyName { get; set; }
    public virtual IEnumerable<AddressView> AddressDetail { get; set; }
}