在 ASP.Net MVC 的视图中使用 2 个表(使用不同的模型返回 2 个 LINQ?)

Posted

技术标签:

【中文标题】在 ASP.Net MVC 的视图中使用 2 个表(使用不同的模型返回 2 个 LINQ?)【英文标题】:Using 2 tables in a View in ASP.Net MVC (Returning 2 LINQ using different models?) 【发布时间】:2016-09-16 02:56:00 【问题描述】:

我有一个View 需要显示,例如,一个User 和一个Role 表。我需要创建 2 个要在视图中返回的 LINQ 查询,一个用于 User,另一个用于 Role,以便我可以在视图中显示 2 个表。到目前为止,我只能返回User,但我如何返回Role?这是我当前的设置:

用户模型

-ViewModel 用于 View 的文本框,Model 用于表中记录的循环

public class UserModel
    
        public int user_id  get; set; 
        public string user_name  get; set; 
        ...
    

用户视图模型

public class UserViewModel
    
        public IPagedList<CDS.Models.UserModel> Users  set; get; 
        public int userId  get; set; 
        public string userName  get; set; 
        ...
    

查看

@model CDS.Models.UserViewModel
@using PagedList.Mvc;

@using (html.BeginForm("Create", "User", FormMethod.Get))

    @Html.HiddenFor(m => m.userId)
    @Html.LabelFor(m => m.userName)
    @Html.TextBoxFor(m => m.userName)

    <table id="dbTable">
        <thead>
            <tr>
                <th class="hidden">
                    @Html.DisplayNameFor(model => model.user_id)
                </th>
                <th>
                    @Html.ActionLink("User", "Create", new  sortOrder = ViewBag.UserSort, currentFilter = ViewBag.CurrentFilter )
                </th>
            </tr>
        </thead>
        <tbody id="dbBody">
            @foreach (var item in Model.Users)
            
                <tr>
                    <td class="hidden">
                        @Html.DisplayFor(modelItem => item.user_id)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.user_name)
                    </td>
                </tr>
            
        </tbody>
    </table>

    //Don't mind this code, it's only for the pagination
    Page @(Model.Users.PageCount < Model.Users.PageNumber ? 0 : Model.Users.PageNumber) of @Model.Users.PageCount
    @Html.PagedListPager(Model.Users, page => Url.Action("Create",
    new  page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter ))

UserController - 我如何为角色返回一个 ViewModel 和另一个 LINQ

DBEntities _odb = new DBEntities();

public ActionResult Create(string sortOrder, string currentFilter, string searchString, int? page)


    var user = from u in _odb.USR_MSTR
                      select new UserModel
                      
                          user_id  = u.USR_ID,
                          user_name  = u.USR_NAME,
                      ;

    int pageSize = 10;
    int pageNumber = (page ?? 1);

    var vm = new UserViewModel();
    vm.Users = user.ToPagedList(pageNumber, pageSize);

    return View(vm);

【问题讨论】:

您开始说要显示Role 表,但随后您询问是否返回Region 我使用PartialView 来显示记录,我只是没有在此处包含它以避免长时间发布。我正在考虑为每个表使用 2 PartialView,但不知道如何返回 2 ViewModels 与不同的 LINQ @StephenMuecke 哦,开枪!实际上这是我当前项目中的另一个表,我只是在我的帖子中使用了一个示例表。我马上修改,谢谢! 但是Role 对用户有一个 FK,所以您肯定想显示每个用户的角色,而不是单独的角色列表吗? 哦,对不起。看来我不应该这么说以避免混淆。我只会删除它。假设我希望UserRole 显示在同一个View 中。 【参考方案1】:

您可以考虑两种选择。

在你的视图模型中为Role的集合添加一个额外的属性

public IEnumerable<Role> Roles  get; set; 

在 GET 方法中

var roles = db.Roles..... // your query
var vm = new UserViewModel()

    Roles = roles,
    Users = user.ToPagedList(pageNumber, pageSize)
;
return View(vm);

或者创建一个返回角色部分视图的 ChildActionOnly 方法

[ChildActionOnly]
public ActionResult FetchRoles()

    var model = ... // your query
    return PartialView(model);

FetchRoles.cshtml

@model IEnumerable<Role>
... // html to display roles

然后在主视图中,使用渲染它

@ Html.RenderAction("FetchRoles", "yourControllerName"); 

【讨论】:

我做了第一个,因为它比第二个对我来说更熟悉,它成功了!谢啦! :) 如果您想在其他页面中重用角色的部分视图,第二个会更合适。

以上是关于在 ASP.Net MVC 的视图中使用 2 个表(使用不同的模型返回 2 个 LINQ?)的主要内容,如果未能解决你的问题,请参考以下文章

使用 2 个表实现 ASP.NET MVC5 搜索功能

如何使用 jquery asp.net mvc 将多个数据插入到数据库中的 2 个表中

ASP.NET MVC5 在用户注册时自动填充第二个表

ASP.net 2.2 MVC:注销

如何在 ASP.NET MVC 视图中显示 2 个列表

ASP.NET MVC4 部分视图