ASP.NETコントローラアクション方法へのビューモデルを持つフォームを投稿する

StackOverflow https://stackoverflow.com//questions/22013590

質問

私は私のMVCコントローラに投稿する必要があるかなり複雑な形式を持っています。

これは私が最初に作成時のビューに渡すビューモデルです:

public class EditViewModel
{
    public Service service { get; set; }
    public bool sms { get; set; }
    public bool email { get; set; }
    public string userId { get; set; }
}
.

これは私のビュー(簡素化された)です:

@model IList<Service_Monitor_Web_Interface.Models.ViewModels.EditViewModel>
@{
  ViewBag.Title = "Configure User Notifications";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm("Edit", "Users", FormMethod.Post, new { @class = "stdform stdform2", role = "form" }))
{
@Html.AntiForgeryToken()
<hr />

<p>
    <label><u> Service:</u> </label>
    <span class="field">
        <u>Notification Methods:</u>
    </span>
</p>


for (int i = 0; i < Model.Count; i++)
{
    <p>
        <label>@Model[i].service.Name</label>
        <span class="field">
            @Html.CheckBoxFor(model => model[i].sms)
            SMS &nbsp;&nbsp;
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}
<br clear="all" /><br />

<p class="stdformbutton">
    <button class="submit radius2">Save</button>
    <input type="reset" class="reset radius2" value="Reset Form" />
</p>
}
.

そしてここで私のコントローラの私のアクション方法です:

    //
    // POST: /Users/Edit
    [HttpPost]
    public ActionResult Edit(IList<EditViewModel> viewModel)
    {
        return View(viewModel);
    }
.

コントローラの受信時にビューモデルをバインドする方法はありますか? 現在アクションメソッドをデバッグすると、そのようなビューモデルを受信します。

ENTER IMENTDESCRUスト)

どのように私はサービスを受けることができ、useridがnullにならないのですか?

役に立ちましたか?

解決

ヘルパーのラムダでは、model => service.sms右側の部分(service.sms)では、左側の部分(model)から派生していません。これにより、結果の入力が同じようになるすべてのname属性が同じであり、期待していなかったパラメータを要求します。

標準的な慣行は、ループケースでforを拘束されたforeachを使用することです。結果のHTMLの名前属性が正しく生成されます。

for(int i=0; i<Model.Count; i++)
{
    <p>
        <label>@Model[i].service.Name</label>
        <span class="field">                
            @Html.CheckBoxFor(model => model[i].sms)
            SMS &nbsp;&nbsp;               
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}
.

これは、Modelを使用してIListを実装するようにIEnumerableを必要とする。

アップデート。他の値には、UIがありません。隠しフィールドを使用すると、ユーザーが表示されず、それでもサーバーに転記されます。

<label>@Model[i].service.Name</label>
<span class="field">                
    @Html.CheckBoxFor(model => model[i].sms)
    SMS &nbsp;&nbsp;               
    @Html.CheckBoxFor(model => model[i].email)
    Email &nbsp;&nbsp;
    @Html.HiddenFor(mode => model[i].userId)
    @Html.HiddenFor(mode => model[i].service.Name)
    ...other field of service you want to be posted...
</span>
.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top