将多个表中的数据呈现到单个视图

本文关键字:单个 视图 数据 | 更新日期: 2023-09-27 18:31:59

我意识到以前有人提出过这种类型的问题,但是,作为一个新手,我真的很难掌握这个问题。任何帮助,不胜感激。

我有两个表 - 一个工作人员表和一个称呼表 - 我有单独的模型和视图。视图的记录放置在表单中以供用户编辑,并通过 LINQ 查询进行填充。每个员工记录都包含一个称呼 ID 值。我想要一个单一的视图,它将列出所有员工记录,并附上适当的称呼。

我相信我需要的是一个 ViewModel,我也相信它与我用来创建实际数据库表的模型不同。然而,我如何使用这样的视图模型来提取我需要的数据,这让我无法理解。我当前的代码如下:

上下文:

public class LibraryContext : DbContext
{
    public DbSet<PrmTbl_Staff> PrmTbl_Staffs { get; set; }
    public DbSet<PrmTbl_Salutation> PrmTbl_Salutations { get; set; }
}

模型

public class PrmTbl_Staff
{
    public int ID { get; set; }
    public int SalutationID { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
    public PrmTbl_Staff(int id, int salID, string name, Boolean active)
    {
        ID = id;
        SalutationID = salID;
        Name = name;
        Active = active;
    }
}
public class PrmTbl_Salutation
{
    public int ID { get; set; }
    public string Desc { get; set; }
    public bool Active { get; set; }
    public PrmTbl_Salutation(int id, string desc, Boolean active)
    {
        ID = id;
        Desc = desc;
        Active = active;
    }
}

控制器

    private LibraryContext staffDB = new LibraryContext();
    public ActionResult Staff()
    {
        ViewBag.Title = "Parameters - Staff";
        var StaffQuery = from st in staffDB.PrmTbl_Staffs
                         join sal in staffDB.PrmTbl_Salutations on st.SalutationID equals sal.ID
                         where st.Active == true
                         orderby st.ID descending
                         select st;
        var count = StaffQuery.Count();
        if (count == 0)
        {
            ViewBag.NullRes = "There are no Results to View!";
        }
        return View(StaffQuery.ToList());
    }
    private LibraryContext saltDB = new LibraryContext();
    public ActionResult Salutation()
    {
        ViewBag.Title = "Parameters - Salutations";
        var SaltQuery =
            (from a in saltDB.PrmTbl_Salutations
             where a.Active == true
             orderby a.ID descending
             select a);
        var count = SaltQuery.Count();
        if (count == 0)
        {
            ViewBag.NullRes = "There are no Results to View!";
        }
        return View(SaltQuery.ToList());
    }

视图:

if (ViewBag.NullRes == null) {
    using (Html.BeginForm("UpdateStaff", "Parameter", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Update Form</legend>
            <table>
                <thead>
                    <tr>
                        <th>@Html.DisplayNameFor(model => model.ID)</th>
                        <th>@Html.DisplayNameFor(model => model.SalutationID)</th>
                        <th>@Html.DisplayNameFor(model => model.Name)</th>
                        <th>@Html.DisplayNameFor(model => model.Active)</th>
                    </tr>
                </thead>
                @foreach (var item in Model)
                {
                    var thisID = item.ID;
                    var thisSalID = item.SalutationID;
                    var thisName = item.Name;
                    var thisActive = item.Active;
                    // note that intellisense does not pick up any values 
                    // from the Salutations table, so I assume my 
                    // LINQ query is incomplete. For now, I'll just echo the ID
                    <tr>
                        <td class="tdsm centered fade"> @thisID </td>
                        <td> <input type="text" name="@(thisID + ".salID")" value="@thisSalID" /> </td>
                        <td> <input type="text" name="@(thisID + ".name")" value="@thisName" /> </td>
                        <td class="tdsm centered">
                            @{
                                if (@thisActive)
                                {
                                    <text><input type="checkbox" name="@(thisID + ".active")" value="true" checked="checked" /></text>
                                }
                                else
                                {
                                    <text><input type="checkbox" name="@(thisID + ".active")" value="true" /></text>
                                }
                            }
                        </td>
                    </tr>
                }
            </table>
            <p> <input type="submit" value="Update" /> </p>
        </fieldset>
    } 
}
else {
    <p>@ViewBag.NullRes</p>
}

因此,总而言之,我希望"称呼"表中的 Desc 值与工作人员的姓名一起显示在视图中。理想我希望所有问候显示为下拉列表,并显示适当的称呼,但如果我可以打破最初的问题,我会同样高兴。

请注意,我确实尝试了 ViewModel(就像其他模型一样创建,视图会拾取它,但我不知道如何从中绘制任何值,或者它们如何相互配对 Salt => 名称明智...无论如何,我把它包括在这里。

public class StaffSalutation
{
    public List<PrmTbl_Salutation> Salutations { get; set; }
    public List<PrmTbl_Staff> Staffs { get; set; }
}

正如我所说,我真的很感谢任何帮助 - 而且解释越重越好!我担心MVC的一些概念正在从我身边溜走。

编辑 - 当前控制器

    private LibraryContext staffDB = new LibraryContext();
    public ActionResult Staff()
    {
        ViewBag.Title = "Parameters - Staff";
        IEnumerable<PrmTbl_Staff> StaffQuery;
        StaffQuery = from st in staffDB.PrmTbl_Staffs
                        join sal in staffDB.PrmTbl_Salutations on st.SalutationID equals sal.ID
                        where st.Active == true
                        orderby st.ID descending
                        select st;
        if (StaffQuery.Count() == 0)
        {
            ViewBag.NullRes = "There are no Results to View!";
        }
        var viewModel = StaffQuery.Select(staff =>
            new StaffSalutation
            {
                StaffID = staff.ID,
                Name = staff.Name,
                Salutation = staff.Salutation.Desc,
                Active = staff.Active
            }
        );
        return View(viewModel);
    }

将多个表中的数据呈现到单个视图

ViewModel 的想法是拥有一个简单、无逻辑的数据包,这些数据可以传递给视图。ViewModel 可能包含来自不同模型的数据(在您的例子中是工作人员和称呼),但它应仅包含视图中使用的数据。

因此,要显示带有称呼的员工列表,您将使用以下 ViewModel:

public class StaffSalutation
{
    public int StaffID { get; set; }
    public string Name { get; set; }
    public string Salutation {get; set; }
}

要获取您的视图模型,您可以使用以下内容:

IEnumerable<PrmTbl_Staff> StaffQuery;
//get your data here
var viewModel = StaffQuery.Select(staff => 
    new StaffSalutation 
    { 
          StaffID = staff.ID, 
          Name = staff.Name, 
          Salutation = staff.Salutation.Desc 
    });
return View(viewModel);

请注意,我在对象模型中使用了 Staff 和 Salutation 之间的缺失引用,因此您的类看起来更像:

public class PrmTbl_Staff
{
    public int ID { get; set; }
    public int SalutationID { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
    //reference to Salutation
    public PrmTbl_Salutation Salutation {get; set;}
    //...
}