我有一个新的MVC 4应用程序,它具有相当基本的视图/控制器。关联的模型包含一些我已映射到隐藏表单字段的属性。当页面第一次呈现时(例如通过HttpGet Action ),它看起来都很好。但是,当通过选择“提交”按钮对表单进行“发布”时,呈现给“操作”的结果模型不再设置“隐藏”字段值。以下是详细信息的演练。
以下是模型:
的示例public class Application
{
public bool ShowSideBars { get; set; }
}
以下是最初的控制器 * 操作 *(似乎可以正常运行):
[HttpGet]
public ActionResult Application()
{
var model = Request.ParseFromQueryString<Application>();
model.ShowSideBars = true;
return View(model);
}
这会映射到查看,如下所示:
<fieldset>
@Html.HiddenFor(m => m.ShowSideBars)
...
</fieldset>
这会导致在字段集中呈现以下标记:
<input data-val="true" data-val-required="The ShowSideBars field is required." id="ShowSideBars" name="ShowSideBars" type="hidden" value="True" />
注意:我确定希望我知道为什么当我没有按要求标记时,MVC已经决定添加'... field is required'内容,但这是另一个问题
以下是提交表单时调用的操作。此时,上述属性将不再设置为“ true ”。
[HttpPost]
public ActionResult Application(Application application)
{
// Other work done here
return View(application);
}
目前,还没有自定义模型绑定器。此外,我已经测试了一些其他数据类型,我看到了同样的事情。
有人可以解释为什么不返回隐藏的表单值吗?我只是这样做错了吗?
答案 0 :(得分:10)
如果模型中的属性使用ReadOnlyAttribute修饰,则不会将值填充回模型中。毕竟,它是只读的。
答案 1 :(得分:7)
我无法重现该问题(在VS 2010 .NET 4.0上运行的ASP.NET MVC 4 Beta)。
型号:
public class Application
{
public bool ShowSideBars { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Application()
{
var model = new Application();
model.ShowSideBars = true;
return View(model);
}
[HttpPost]
public ActionResult Application(Application application)
{
return Content(application.ShowSideBars.ToString());
}
}
查看:
@model Application
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.ShowSideBars)
<button type="submit">OK</button>
}
当我提交表单时,模型绑定器会正确地将POST操作中的ShowSideBars
属性指定为true。
注意:我确定希望我知道为什么MVC决定添加'...字段是 当我没有按要求标记时所需的'内容,但那是为了 另一个问题
这是因为总是需要非可空类型,例如布尔值。您可以通过在Application_Start
中添加以下行来阻止ASP.NET MVC帮助程序为它们发出HTML5数据 - *客户端验证属性:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
答案 2 :(得分:6)
我认为字段必须位于html标记内,以便隐藏的字段被回发而不会被忽略
答案 3 :(得分:4)
我遇到了同样的问题。表单没有提交隐藏属性,因为模型类没有为该属性提供正确的 getter和setter 。 我知道这不是你的问题,只是认为它可能会帮助其他人在这个页面中借出。
答案 4 :(得分:0)
试试这个:
public class Model
{
[ScaffoldColumn(false)]
public bool InvisibleProperty { get; set; }
}
更多信息here (ScaffoldColumn(bool value) vs HiddenInput(DisplayValue = bool value) in MVC)
答案 5 :(得分:0)
在我的情况下,这是因为我声明了一个字段而不是一个属性:
public BaseController.Modes Mode;
不起作用。但是:
public BaseController.Modes Mode { get; set; }
的工作原理。默认模型绑定器仅适用于属性。
答案 6 :(得分:0)