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"); } } } } 

问题确实是由母版页的使用引起的。 当在数据绑定控件之外使用时(例如GridViewFormViewMenu等), FormValueProvider期望在Request.Form字典中具有与模型对象中的属性名称相同的键。

如果您仔细查看生成的HTML,您将看到所有带有母版页的表单中的input标签的name属性值设置为类似于ctl00$ContentPlaceHolder1$FirstNamectl00$ContentPlaceHolder1$LastName等,而没有母版页的表单则name属性完整且等于control的ID属性的值。

这是生成UniqueID以避免名称重复的方式(应该避免这种情况,因为在Web窗体中我们只能有一个form标记,因此在母版页和表单页面上都有相同ID's控件)。

这就是为什么FormValueProvider无法获取testClass2对象的值的原因,它只是找不到发布forms的FirstNameLastNameMiddleName值。

我找到了一个解决方案。您可以编写一些前端代码来将name设置为id并且不要忘记将ClientIDMode设置为Static