2012-03-19 20 views
10

我有一个新的相当基本的视图/控制器的MVC 4应用程序。相关模型包含一对夫妇属性,我已将其映射到隐藏表单字段。当页面第一次渲染时(,例如通过HttpGet动作),它看起来都很好。但是,当通过选择提交按钮来完成表单时,呈现给操作的结果模型不再具有设置的隐藏字段值。这是一个详细的演练。回复后隐藏的表单字段不出现在MVC模型中

这里是模型的样品:

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已决定加入”。 ..字段是必需的'内容,当我没有按要求标记,但这是另一个问题

这是活动在提交表单时调用的是。此时上述属性将不再设置为'true'。

[HttpPost] 
public ActionResult Application(Application application) 
{ 
    // Other work done here 

    return View(application); 
} 

目前还没有定制型号粘结剂。另外,我测试了一些其他的数据类型,我看到了同样的事情。

有人可以解释为什么隐藏的表单值没有被返回?我只是做这一切都错了吗?

+2

的'数据-VAL-required'被渲染,因为模型类型是'bool'。 Bools默认是必需的,它们必须是真或假。如果你不想看到data-val所需的数据,那么使这个属性成为'bool?'。 – danludwig 2012-03-19 19:15:32

+1

另外,Data Annotations会将“必需”添加到任何不可为空的类型。 Ints和Bools将根据需要自动标记。 – 2012-03-19 19:17:07

+0

@ danludwig好主意!谢谢。这将防止整个页面大小有点膨胀。 – JoeGeeky 2012-03-19 19:20:59

回答

6

我无法重现该问题(在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财产分配真正。

注:我当然希望我知道为什么MVC决定添加'...场时,我并没有将其标记为需要 要求”的内容,但这是 另一个问题

这是因为非可空类型,如布尔总是需要。

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

无法解释它,但是当我将更改应用于模型和视图以支持隐藏字段的可空类型时,它们全部开始工作。谢谢。 – JoeGeeky 2012-03-19 23:19:33

+0

我相信MVC会根据需要标记该字段,因为bool不是可以为空的类型。如果你想删除这个需求,你需要使用bool?作为类型。 – Kevin 2017-10-25 22:31:54

8

如果你有一个ReadOnlyAttribute装饰价值将在模型中的特性:你可以从发射HTML5数据 - 停止ASP.NET MVC佣工*客户端验证他们的投入Application_Start以下行属性不会被填充回你的模型中。毕竟,它是只读的。

+5

我创造了同样的错误,有一个私人二传手 – Kieran 2014-02-26 09:53:44

+1

我有一个属性是'内部'设置。是的,这是做的(vs助手添加属性从书面代码添加属性作为内部集 – 2017-08-02 03:11:08

2

我有同样的问题。表单没有提交隐藏的属性,因为该模型类没有适当的getter和setter该属性。 我知道这不是你的问题,只是认为它可能会帮助其他人在这个页面上放贷。

4

我觉得领域的形式必须是html标签内是张贴在隐藏的人回来,而不是忽视

+0

这是真的。把所有隐藏的领域内的形式标签解决我的问题。 – Ariwibawa 2017-03-03 07:18:26

0

对我来说,那是因为我已经声明的字段,而不是一个属性:

public BaseController.Modes Mode; 

不起作用。但是:

public BaseController.Modes Mode { get; set; } 

的作品。默认模型联编程序仅适用于属性。

0

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

我的表单中有两个相同的字段。其他领域实际上并不在形式中,但那并不重要。

运行这个jQuery的开发者控制台来查看有多少元素回来:

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

例子:

enter image description here