如何在Razor视图中显示其他模型列?

时间:2016-03-10 10:00:45

标签: c# asp.net-mvc asp.net-mvc-4 razor

目前,我可以在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>

5 个答案:

答案 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

相关问题