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

时间:2013-09-19 22:17:12

标签: c# asp.net-mvc asp.net-mvc-4 linq-to-sql

我意识到此类问题已经提出过,但是,作为一个新手,我真的很难掌握这个问题。任何帮助表示赞赏。

我有两个表 - 一个Staff表和一个Salutation表 - 我有单独的模型和视图。视图的记录放在用户编辑的表单中,并通过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>
}

因此,总而言之,我希望Salutations表中的Desc值显示在与员工姓名一起的视图中。 理想情况我希望所有称呼显示为下拉列表,并显示相应的一个,但如果我能打破最初的问题,我会同样高兴。

请注意,我确实尝试过ViewModel(就像其他模型一样创建,View会选择它,但我不知道如何从中绘制任何值,或者它们如何与每个模型配对其他Salt =&gt;姓名......)无论如何我都把它包括在内。

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);

    }

1 个答案:

答案 0 :(得分:2)

ViewModel的想法是拥有一个简单,无逻辑的数据包,可以传递给视图。 ViewModel可能包含来自不同模型的数据,在您的情况下是Staff和Salutation,但它应该只包含视图中使用的数据。

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

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

要获取ViewModel,您可以使用以下内容:

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;}

    //...
}