目前,我可以在userRole模型中显示razer视图中的所有列。 只是好奇我是否想在UserRole Razor视图中显示SiteName列,而不是显示SiteID,是否可能?我知道它可以通过自定义视图模型完成,但它是必须的吗?如果我错了请纠正我!
UserRole型号:
public int UserID { get; set; }
public string UserName { get; set; }
public int SiteID { get; set; }
*No SiteName column here....so i only can show SiteID in razor..
网站模型:
public int SiteID { get; set; }
public string SiteName { get; set; } <<-- the column i want..
控制器:
public ActionResult Index()
{
//need join table here perhaps?
return View(db.User_Role.ToList());
}
Razor查看:
@model IEnumerable<FAB_Portal_POC.Models.UserRole>
<table class="table table-striped table-hover">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserName)
</th>
<th>
@Html.DisplayNameFor(model => model.Role)
</th>
<th>
@Html.DisplayNameFor(model => model.SiteID)
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Role)
</td>
<td>
@Html.DisplayFor(modelItem => item.SiteID) <<-- i want site name.
</td>
</tr>
}
</table>
答案 0 :(得分:4)
第一个问题是您的UserRole
实体模型似乎没有导航属性。
你不需要,但随后查询变得尴尬:
var rolesWithSite = from r in db.User_Role
join s in db.Sites on s.ID equals r.Site_ID
select new
{
Role = r,
Site = s
}
.ToList();
当您添加导航属性(甚至可能代替外键属性)时:
public class User_Role
{
public int UserID { get; set; }
public string Role { get; set; }
public string UserName { get; set; }
public virtual Site Site { get; set; }
}
查询将变得更容易:
var rolesWithSite = db.User_Role.Include(r => r.Site).ToList();
然后您可以引入一个viewmodel:
public class UserRoleViewModel
{
public int UserID { get; set; }
public string UserName { get; set; }
public string Role { get; set; }
public string Site { get; set; }
}
并将查询结果映射到:
var viewModels = rolesWithSite.Select(r => new UserRoleViewModel
{
UserID = r.UserID,
UserName = r.UserName,
Role = r.Role,
Site = r.Site.SiteName,
}).ToList();
return View(viewModels);
答案 1 :(得分:1)
实体和模型非常不同。
您必须为您的网页创建特定模型。
类似的东西:
PageModel
public string UserName { get; set; }
public string SiteName { get; set; }
在您的控制器中,您必须准备要发送到页面的所有数据。在这里,您将把您的实体“关联”到您的页面模型
public ActionResult Index()
{
var roles = db.User_Role.ToList();
var sites = db.Sites.ToList(); // i don t know how you get this information in your exemple.
//define here every property of the PageModel you want to use there
var model = new PageModel();
model.UserName = roles.UserName;
model.SiteName = sites.Select(...).SiteName;
return View(model);
}
然后在剃刀视图中
@model IEnumerable<FAB_Portal_POC.Models.PageModel>
希望它会有所帮助
答案 2 :(得分:0)
您可以将站点列表存储在ViewBag中,并通过从ViewBag中提取站点名称来显示站点名称:
public ActionResult Index()
{
ViewBag.Sites = db.Sites.ToList();
return View(db.User_Role.ToList());
}
观点:
<td>
@Html.DisplayFor(modelItem => ViewBag.Sites.Single(s => s.SiteID == item.SiteID).SiteName)
</td>
另一个,对我来说更好的方法是为您的视图创建一个ViewModel
,其中包含您需要的所有数据。并将该视图模型返回到您的视图。
public class UserSiteViewModel
{
public int UserID { get; set; }
public string UserName { get; set; }
public string Role { get; set; }
public int SiteID { get; set; }
public string SiteName { get; set; }
}
答案 3 :(得分:0)
您有多种方法可以做到这一点,简单的方法是创建新的类名UserRoleViewData并提及这些字段并传递类对象进行查看。就像那样。
新类 UserRoleViewData 看起来像这样
img
和您的控制器
public int UserID { get; set; }
public string UserName { get; set; }
public int SiteID { get; set; }
public string SiteName { get; set; }
在视图中您必须更改public ActionResult Index()
{
List<className> dto = (from a in _db.User_Role
join b in db.Site on a.SiteID equals b.SiteID
select (new classname { UserID =a.UserID , UserName =a.UserName , SiteID =a.SiteID , SiteName =b.SiteName })).ToList();
return View(dto);
}
并在其他地方查看其他财产。我希望您能理解,这对您有所帮助。
答案 4 :(得分:0)
无需使用ViewBag
,在两个表之间加入,并将结果存储在另一个viewModel
中,这是一个不同的主意。请查看参考链接,它将真正帮助您在非常好的方向上执行代码。 Click Here