0

フォームを投稿するときに、モデルがその値とともにコントローラーに渡されない理由がわかりません。

一連の値を保持する、Web サービスからフェッチされている、厳密に型指定されたモデル (UnitContract) を持つビューがあります。私のアクションでは、モデルに存在する int ID と bool Disabled フィールドをフェッチしようとしています。デバッグ時に、フォームから渡されたモデルに値がまったく含まれていないことがわかります。私は何が欠けていますか?

私の見解(強く型付けされたモデルとしてのUnitContract):

...
<form class="pull-right" action="~/UnitDetails/EnableDisableUnit" method="POST">
        <input type="submit" class="k-button" value="Enable Unit"/>
    </form>

私のコントローラーアクション:

[HttpPost]
public ActionResult EnableDisableUnit(UnitContract model)
{
    var client = new UnitServiceClient();
    if (model.Disabled)
    {
        client.EnableUnit(model.Id);
    }
    else
    {
        client.DisableUnit(model.Id);
    }

    return RedirectToAction("Index", model.Id);
}
4

4 に答える 4

4

モデルからフォームにフィールドを追加する必要があるようです。ビューが UnitContract モデルを受け入れると仮定すると、次のようなものが機能するはずです。

<form class="pull-right" action="~/UnitDetails/EnableDisableUnit" method="POST">
    @Html.HiddenFor(x => x.Id)
    @Html.HiddenFor(x => x.Disabled)
    <input type="submit" class="k-button" value="Enable Unit"/>
</form>

フォームを送信すると、フィールドがモデルに送信されます。

于 2013-04-30T12:57:20.050 に答える
2

MVC フレームワークは、フォームからのデータを使用してモデルを作成します。フォームは本質的に空であるため、モデルを作成するためのデータがないため、データが入力されていないオブジェクトを取得します。

フォームを投稿するときにリクエストでブラウザーから送信される唯一のデータは、フォーム内のデータです。モデルに入力するものがあるように、モデルのプロパティのデータをフォームのフィールドとして配置する必要があります。

于 2013-04-30T12:55:36.227 に答える
2

の使用を検討してください@Html.HiddenFor()。これらをフォームに入れると、コントローラーにポストされたデータがそこにあるはずです。たとえば、フォームは次のようになります...

<form class="pull-right" action="~/UnitDetails/EnableDisableUnit" method="POST">
    @Html.HiddenFor(x => x.Id)
    @Html.HiddenFor(x => x.IsDisabled)
    <input type="submit" class="k-button" value="Enable Unit"/>
</form>
于 2013-04-30T12:58:01.117 に答える
0

次のようなモデルがあるとします。

public class UnitContract
{
    public int Id { get; set; }
    public DateTime SignedOn { get; set; }
    public string UnitName { get; set; }
}

ビューは次のようになります。

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>UnitContract</legend>

        @Html.HiddenFor(model => model.Id)

        <div class="editor-label">
            @Html.LabelFor(model => model.SignedOn)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.SignedOn)
            @Html.ValidationMessageFor(model => model.SignedOn)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.UnitName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UnitName)
            @Html.ValidationMessageFor(model => model.UnitName)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

コントローラーで:

    [ValidateAntiForgeryToken]
    [HttpPost]
    public ActionResult Edit(UnitContract unitContract)
    {
        // do your business here .... unitContract.Id has a value at this point
        return View();
    }

これが役に立てば幸いです。

于 2013-04-30T13:04:32.800 に答える