4

したがって、ビューモデルを作成したいくつかの異なるオブジェクトとオブジェクトのリストをやり取りする必要があるビューがあります。私のビューモデルは次のようになります

public class EditUserViewModel
{
    public ManageUsersViewModel ManageUsersViewModel { get; set; }
    public IEnumerable<StateModel> StateModel { get; set; }
}

私が問題を抱えている部分は、このように見えるStateModelです

public class StateModel
{
    public bool IsChecked { get; set; }
    public States States { get; set; }
    public UsersInStates UsersInStates { get; set; }
}

そしてこれが含まれています

[Table("States")]
public class States
{
    [Key]
    public int StateId { get; set; }
    public string State { get; set; }
}

[Table("UsersInStates")]
public class UsersInStates
{
    [Key, Column(Order = 1)]
    public int UserId { get; set; }
    [Key, Column(Order = 2)]
    public int StateId { get; set; }
    public string LicenseNumber { get; set; }
}

私の見解では、多かれ少なかれ状態をループして、UsersInStates のユーザー入力を取得しようとしています。これは私がそれを達成しようとしている方法ですが、StateModel 全体が null に戻ります。ビューに入ると、StateModel.States にはデータがあり、UsersInStates にはありません。これは私の見解ではどのように見えるかです

@foreach (var state in Model.StateModel)
{
    @Html.HiddenFor(m => state)
    <tr>
        <td>
            @Html.CheckBoxFor(m => state.IsChecked)
        </td>
        <td>
            @Html.Label(state.States.State)
        </td>
        <td>
            @Html.EditorFor(m => state.UsersInStates.LicenseNumber)
        </td>
    </tr>
}

アドバイスをいただければ幸いです。すべてが正常に表示され、ManageUsersViewModel 部分は正常に動作します。コントローラーに返される StateModel データが null であり、これを希望どおりに動作させる方法が正確にはわかりません。

これは、要求されたテーブルの開始と最初の行に対して生成された html がどのように見えるかです。

<table style="margin-left:auto; margin-right:auto; text-align:center">
<input id="state" name="state" type="hidden" value="WebSiteNew.Models.StateModel" />                    <tr>
                <td>
                    <input data-val="true" data-val-required="The IsChecked field is     required." id="state_IsChecked" name="state.IsChecked" type="checkbox" value="true" />    <input name="state.IsChecked" type="hidden" value="false" />
                </td>
                <td>
                    <label for="Alabama">Alabama</label>
                </td>
                <td>
                    <input class="text-box single-line" id="state_UsersInStates_LicenseNumber" name="state.UsersInStates.LicenseNumber" type="text" value="" />
                </td>
            </tr>

答え:

これを解決するために、以下の回答にリストされている両方の参照で説明されているように、for ループを使用しました

@for (int i = 0; i < Model.StateModel.Count(); i++)
{
    <tr>
        <td>
            @Html.HiddenFor(m => m.StateModel[i].States.StateId)
            @Html.HiddenFor(m => m.StateModel[i].States.State)
            @Html.CheckBoxFor(m => m.StateModel[i].IsChecked)
        </td>
        <td>
            @Html.Label(Model.StateModel[i].States.State)
        </td>
        <td>
            @Html.EditorFor(m => m.StateModel[i].UsersInStates.LicenseNumber)
        </td>
    </tr>
}

また、これを見ている人への注意として、インデックス作成を可能にするために、EditUsersViewModel の IEnumerable を IList に変更する必要がありました。

4

2 に答える 2