为隐藏的Asp.net mvc5不会将数据传递给控制器



我试图通过使用hiddenFor将一些隐藏数据传递给我的控制器。我知道我想要的值会进入视图,但在提交表单后,当值到达控制器时,它会保持为空。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);
}

我还尝试使用一个名为hidden的法线,但这也没有返回值。

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

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

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

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

根据您更新的问题进行更新:尝试删除HiddenField并更改<p>@Model.name</p>

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

我确实关注了不正确的事情,问题是我在回发后更改了控制器中的模型。但这只会更改模型,而不会更改表单数据使用的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.

最新更新