C# C MVC视图返回城市和州名称,而不是id
我在试图找出如何显示州和城市的名称而不是StateId和CityId时遇到了一些问题 我知道您可以在模型中放置州和城市的实例,如下所示: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
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; }
}