隐藏的ASP.NET MVC5不会将数据传递给控制器

时间:2018-07-20 13:11:35

标签: asp.net-mvc

我尝试使用hiddenFor传递一些隐藏数据到我的控制器,我知道我想要获取的值,但是在提交表单后,该值到达控制器后仍为null。 EditorFor中的数据已正确传递到控制器。

// View
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    // Some working editorFor fields. Data from these gets successfully received

    // The name is correctly displayed in the paragraph
    <p>@Model.name</p>
    // This data is not received in the controller
    @Html.HiddenFor(x => x.name)

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
}

// Controller
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Product product, HttpPostedFileBase image)
{
    product.name = "a name";
    return View(product);
}

我也尝试过使用隐藏的普通名称,但这也没有返回值。

有人知道我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

如果您有表单,可以使用例如剃刀助手自动传递隐藏字段

@using (Html.BeginForm("CreateTable", "Home", FormMethod.Post, null){ @HiddenFor(i => i.PropertyName) }

并且隐藏字段必须在表单内部,否则您将“丢失”它们。

更新更新后的问题,:尝试删除HiddenField并更改<p>@Model.name</p>

@Html.LabelFor(i => i.Name)

答案 1 :(得分:0)

我确实专注于不正确的事情,问题是回发后我在控制器中更改了模型。但这只会更改模型,不会更改表单数据使用的ModelState。

//This is updated after model changes.
 <p>@Model.name</p>

//For this you need to update the ModelState
@Html.HiddenFor(x => x.name)

在控制器中,您需要使用ModelState.Remove(属性名称)。 (或清除完整的ModelState)

//After removal of the property the ModelState will update to the new model value.
product.name = "a name";
ModelState.Remove("name");
return View(product);

本文对此进行了解释,https://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes