0

この種の質問が以前に提起されたことは認識していますが、初心者として、この問題を理解するのに本当に苦労しています。どんな助けでも大歓迎です。

Staff テーブルと Salutation テーブルの 2 つのテーブルがあり、それぞれに別のモデルとビューがあります。ビューのレコードは、ユーザーが編集できるようにフォームに配置され、LINQ クエリを介して入力されます。各スタッフ レコードには、Salutation 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 = >名前的に...)とにかくここに含めます。

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

    }
4

1 に答える 1

2

ViewModel の考え方は、ビューに渡すことができるデータ用のシンプルでロジックのないバッグを持つことです。ViewModel には、スタッフと挨拶の場合、さまざまなモデルからのデータが含まれる場合がありますが、ビューで使用されるデータのみを含める必要があります。

したがって、挨拶付きのスタッフのリストを表示するには、次の 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;}

    //...
}
于 2013-09-19T23:25:07.807 に答える