繁体   English   中英

为什么我的模型未通过表单发布作为参数传递

[英]Why is my model not passed as parameter with form post

我在理解为什么在发布表单时为什么不将模型及其值传递到控制器时遇到了麻烦。

我有一个带有强类型模型(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);
}

听起来您需要将模型中的字段添加到表单中。 假设您的视图接受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>

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

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

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

研究使用@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>

假设您有一个这样的模型:

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();
    }

希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM