隐藏的表单字段在回发后没有出现在MVC模型中

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修饰,则不会将值填充回模型中.毕竟,它是只读的.

  • 我通过为该字段设置私有setter来创建相同的错误 (6认同)
  • 我有一个“内部”属性集。是的,就是这样(与从书面代码添加属性的帮助程序相比,该帮助程序将属性添加为内部集 (2认同)

Dar*_*rov 7

我无法重现该问题(在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)


Rav*_*erg 6

我只是有同样的问题。表单未提交hidden属性,因为模型类没有针对该属性的适当的getter和setter方法。我知道这不是您遇到的问题,只是想知道它可能会对将在此页面中提供贷款的其他人有所帮助。


ibe*_*dev 6

我认为字段必须在html标签的形式内,以便隐藏的字段被回发而不被忽略