Joe*_*eky 12 c# asp.net-mvc asp.net-mvc-4
我有一个新的MVC 4应用程序与一个相当基本的视图/控制器.关联的模型包含一些我已映射到隐藏表单字段的属性.当Page第一次渲染时(例如通过HttpGet Action),它看起来都很好.但是,当通过选择"提交"按钮对表单进行"发布"时,呈现给"操作"的结果模型不再设置"隐藏"字段值.这是细节的演练.
以下是模型的示例:
public class Application
{
public bool ShowSideBars { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是最初的Controller*Action*(看起来工作正常):
[HttpGet]
public ActionResult Application()
{
var model = Request.ParseFromQueryString<Application>();
model.ShowSideBars = true;
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
这将映射到View,如下所示:
<fieldset>
@Html.HiddenFor(m => m.ShowSideBars)
...
</fieldset>
Run Code Online (Sandbox Code Playgroud)
这会导致在fieldset中呈现以下标记:
<input data-val="true" data-val-required="The ShowSideBars field is required." id="ShowSideBars" name="ShowSideBars" type="hidden" value="True" />
Run Code Online (Sandbox Code Playgroud)
注意:我当然希望我知道为什么MVC决定在我没有按要求标记时添加'... field is required'内容,但那是另一个问题
这是在提交表单时调用的Action.此时,上述属性将不再设置为" true ".
[HttpPost]
public ActionResult Application(Application application)
{
// Other work done here
return View(application);
}
Run Code Online (Sandbox Code Playgroud)
目前,还没有自定义模型绑定器.此外,我已经测试了一些其他数据类型,我看到了同样的事情.
有人可以解释为什么不返回隐藏的表单值?我只是这样做错了吗?
小智 10
如果模型中的属性使用ReadOnlyAttribute修饰,则不会将值填充回模型中.毕竟,它是只读的.
我无法重现该问题(在VS 2010 .NET 4.0上运行的ASP.NET MVC 4 Beta).
模型:
public class Application
{
public bool ShowSideBars { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
@model Application
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.ShowSideBars)
<button type="submit">OK</button>
}
Run Code Online (Sandbox Code Playgroud)
当我提交表单时,模型绑定器正确地将ShowSideBarsPOST操作中的属性指定为true.
注意:我当然希望我知道为什么MVC决定在我没有按要求标记时添加'... field is required'内容,但那是另一个问题
那是因为总是需要非可空类型,例如布尔值.您可以通过将以下行放入以下行来阻止ASP.NET MVC帮助程序为它们发出HTML5数据 - *客户端验证属性Application_Start:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Run Code Online (Sandbox Code Playgroud)
我只是有同样的问题。表单未提交hidden属性,因为模型类没有针对该属性的适当的getter和setter方法。我知道这不是您遇到的问题,只是想知道它可能会对将在此页面中提供贷款的其他人有所帮助。