我正在使用 WebForms,并且尝试在母版页内执行模型验证,由于某种原因,模型没有获取值,这意味着如果我输入一个好的值,则在验证触发后,模型会一直返回空,因此一遍又一遍地触发验证。如果我将代码放在没有母版页的页面中,它就可以正常工作。我举了一个非常简单的例子,老实说,很难相信母版页如此常见,到目前为止还没有人遇到过这种情况。出于本示例的目的,我将模型嵌入到代码隐藏中,但在外部也没有什么不同。任何想法都会受到极大的欢迎。谢谢。
--母版页--
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="test.master.cs" Inherits="test" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
-- 网页表格 --
<%@ Page Title="" Language="C#" MasterPageFile="~/test.master" AutoEventWireup="true" CodeFile="test3.aspx.cs" Inherits="test3" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div>
<asp:ValidationSummary ID="valSummary" runat="server" />
</div>
<div><label>First Name:</label></div>
<div><input type="text" id="FirstName" runat="server" /></div>
<div><label>Middle Name:</label></div>
<div><input type="text" id="MiddleName" runat="server" /></div>
<div><label>Last Name:</label></div>
<div><input type="text" id="LastName" runat="server" /></div>
<div>
<asp:Button ID="btnSubmit" runat="server" Text="Submit" />
</div>
</asp:Content>
-- 隐藏代码 --
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
, ETC。),FormValueProvider
期望有相同的密钥Request.Form
字典作为模型对象中的属性名称。
如果您仔细查看生成的 HTML,您会发现所有input
带有母版页的表单中的标签有name
属性值设置为类似ctl00$ContentPlaceHolder1$FirstName
, ctl00$ContentPlaceHolder1$LastName
等,而没有母版页的表单则保留 name 属性完整并等于控件的值ID
财产。
这是方法UniqueID生成以避免名称重复(应该避免这种情况,因为在 Web 表单中我们只能有一个form
标签,因此具有相同的控件ID's
母版页和表单页上)。
这就是原因FormValueProvider
无法获取您的值testClass2
对象,它只是找不到FirstName
, LastName
, MiddleName
以发布形式发布的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)