ASP.NET 4.5 TryUpdateModel不使用母版页在WebForm中选择表单值
我正在使用WebForms并且我正在尝试在Master-Page中执行模型validation,并且由于某种原因,模型没有获取值,这意味着在validation触发后如果我输入一个好的值,模型会一直空回来一遍又一遍地触发validation。 如果我把代码放在没有母版页的页面中,它可以正常工作。 我能够举出一个非常简单的例子,老实说,很难相信像MasterPages一样常见,到目前为止还没有人遇到这种情况。 出于本示例的目的,我将模型嵌入到代码隐藏中,但外部没有区别。 任何想法都将受到欢迎。 谢谢。
–master-Page–
– WebForm –
– 代码背后 –
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.ModelBinding; using System.ComponentModel.DataAnnotations; public partial class test3 : System.Web.UI.Page { public class testClass2 { [Required()] [MinLength(2)] public string FirstName { get; set; } public string MiddleName { get; set; } [Required()] [MinLength(2)] public string LastName { get; set; } } protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack) { testClass2 tc = new testClass2(); if (TryUpdateModel(tc, new FormValueProvider(ModelBindingExecutionContext))) { System.Diagnostics.Debug.WriteLine("test"); } } } }
问题确实是由母版页的使用引起的。 当在数据绑定控件之外使用时(例如GridView
, FormView
, Menu
等), FormValueProvider
期望在Request.Form
字典中具有与模型对象中的属性名称相同的键。
如果您仔细查看生成的HTML,您将看到所有带有母版页的表单中的input
标签的name
属性值设置为类似于ctl00$ContentPlaceHolder1$FirstName
, ctl00$ContentPlaceHolder1$LastName
等,而没有母版页的表单则name属性完整且等于control的ID
属性的值。
这是生成UniqueID
以避免名称重复的方式(应该避免这种情况,因为在Web窗体中我们只能有一个form
标记,因此在母版页和表单页面上都有相同ID's
控件)。
这就是为什么FormValueProvider
无法获取testClass2
对象的值的原因,它只是找不到发布forms的FirstName
, LastName
, MiddleName
值。
我找到了一个解决方案。您可以编写一些前端代码来将name
设置为id
并且不要忘记将ClientIDMode
设置为Static