为什么我的模型没有作为带有表单帖子的参数传递

时间:2013-04-30 12:48:54

标签: c# asp.net-mvc asp.net-mvc-4

我无法理解为什么我的模型在发布表单时不会将其值传递给我的控制器。

我有一个带有强类型模型(UnitContract)的视图,它从Web服务中获取,它包含一组值。在我的操作中,我正在尝试获取我的模型中存在的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 个答案:

答案 0 :(得分: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>

现在,当您提交表单时,它应该将字段提交给您的模型。

答案 1 :(得分:2)

MVC框架将使用表单中的数据来创建模型。由于您的表单基本上是空的,因此没有数据可以创建模型,因此您将获得一个没有填充任何数据的对象。

发布表单时,请求中浏览器发送的唯一数据是表单内的数据。您必须将模型中属性的数据作为表单中的字段放置,以便有一些东西可以填充模型。

答案 2 :(得分: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>

答案 3 :(得分: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();
    }

希望这有用。