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

时间:2012-03-19 19:06:19

标签: c# asp.net-mvc asp.net-mvc-4

我有一个新的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);
}

目前,还没有自定义模型绑定器。此外,我已经测试了一些其他数据类型,我看到了同样的事情。

有人可以解释为什么不返回隐藏的表单值吗?我只是这样做错了吗?

7 个答案:

答案 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)

我不骗你,这是它可能发生的另一个原因。

我的表单中有两次相同的字段。另一个字段实际上不在表单中,但这并不重要。

在开发者控制台中运行此jQuery以查看有多少元素返回:

$("[id$=PropertyName]"); // Search for ids ending with property name.

示例:

enter image description here