0

ASP .NET MVC4 ベースのアプリを作成中です。私はその分野では全くの初心者です。アイデアは非常に単純です。DB にいくつかのメンバーを配置し、それらをリストに表示し、チェック ボックスを使用して目的のメンバーを選択し、以前に選択したメンバーで何かを行う他のコントローラーにリダイレクトします。

問題は、ビューからコントローラーにメンバーのリストを渡すことです。ViewModelで動作すると思いました。確かにコントローラーからビューまでは機能しますが、その逆は機能しません。

私のビューモデル:

public class MembersViewModel
{
    public IEnumerable<Directory_MVC.Models.Member> MembersEnum { get; set; }

    public string Test { get; set; }
}

私のコントローラーのスニペット:

public class MembersController : Controller
{
    private MainDBContext db = new MainDBContext();

    public ActionResult Index()
    {
        var model = new Directory_MVC.ViewModels.MembersViewModel();

        // populating from DB
        model.MembersEnum = db.Members.Include(m => m.Group).Include(m => m.Mother).Include(m => m.Father);

        model.Test = "abc";

        return View(model);
    }

    [HttpPost]
    public ActionResult GoToSendEmail(Directory_MVC.ViewModels.MembersViewModel returnedStruct)
    {
        if (ModelState.IsValid)
        {
            // it is valid here
            return Redirect("http:\\google.com");
        }
    }

私のビューのスニペット:

@model Directory_MVC.ViewModels.MembersViewModel


@{
ViewBag.Title = "Members listing";

var lineCount = 0;
string lineStyle;
}

@using (Html.BeginForm("GoToSendEmail", "Members", FormMethod.Post))
{
<table>
@foreach (var item in Model.MembersEnum)
{
    lineCount++;

    // set styling
    if (lineCount % 2 == 1)
    {
        lineStyle = "odd-line";
    }
    else
    {
        lineStyle = "even-line";
    }

    <tr class="@lineStyle">
        <td>
            @Html.EditorFor(modelItem => item.Selected)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FirstName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Mother.FirstName) @Html.DisplayFor(modelItem => item.Mother.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Father.FirstName) @Html.DisplayFor(modelItem => item.Father.LastName)
        </td>
  <!-- other print-outs but not all properties of Member or Mother/father are printed -->
    </tr>
 }

</table>

<input type="submit" value="Send E-mail" />
}

データはビューに正常に表示されます。ただし、そのフォームを送信すると、コントローラーのメソッド GoToSendEmail で、returnedStruct.MembersEnum と Test 文字列が両方とも nullになります。

間違いがありますか、またはそのメンバー構造を渡して Selected プロパティをチェックする別の方法がありますか?

4

2 に答える 2

1

コレクションへのモデル バインディングの動作は少し異なります。入力がすべて同じ名前にならないように、各項目には識別子が必要です。ここで同様の質問に答えました。

@for (int i = 0; i < Model.MembersEnum.Count(); i++)
{
    @Html.EditorFor(modelItem => modelItem.MembersEnum[i].FirstName)
}

...次のようにレンダリングする必要があります...

<input type="text" name="MembersEnum[0].FirstName" value="" />
<input type="text" name="MembersEnum[1].FirstName" value="" />
<input type="text" name="MembersEnum[2].FirstName" value="" />

...コントローラーによって取得されたときに、ViewModel にコレクションを設定する必要があります...

public ActionResult GoToSendEmail(ViewModels.MembersViewModel model)

他の回答で述べたように、Scott HanslemanPhil Haackの関連記事をいくつか見てみたいと思います。

Testまた、呼び出される文字列は、アクションnullに送信するときであると述べました。POSTフォーム内のどこにもこのプロパティのフィールドを追加していないため、モデル バインダーがバインドするものは何もありません。フォーム内にフィールドを追加すると、POSTアクションに値が表示されます。

@Html.EditorFor(modelItem => modelItem.Test)
于 2013-05-11T02:21:28.730 に答える
0

Html.BeginCollectionItem() ヘルパーが仕事をしました - BeginCollectionItem

于 2013-05-11T09:26:14.993 に答える