ASP.NET 4.5 TryUpdateModel不使用Master-Page在WebForm中选择Form值

时间:2014-06-06 13:13:56

标签: c# asp.net validation webforms master-pages

我正在使用WebForms并且我正在尝试在Master-Page中执行模型验证,并且由于某种原因,模型没有获取值,这意味着如果我输入一个好的值,在验证触发后,模型将继续出现返回空,从而反复触发验证。如果我将代码放在没有母版页的页面中,它可以正常工作。我能够提出一个非常简单的例子,老实说,很难相信像MasterPages一样普遍,到目前为止还没有人遇到过这种情况。出于本示例的目的,我将模型嵌入到代码隐藏中,但外部没有区别。任何想法都将受到欢迎。感谢。

- 主页 -

<%@ 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>

- WebForm -

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

2 个答案:

答案 0 :(得分:4)

问题确实是由母版页的使用引起的。在data bound control之外使用时(例如GridViewFormViewMenu等),FormValueProvider期望在{{1}中使用相同的键字典作为模型对象中的属性名称。

如果您仔细查看生成的HTML,您会看到包含母版页的表单中的所有Request.Form代码都将input属性值设置为name,{{1没有母版页的表单使名称属性保持不变,并且等于控件的ctl00$ContentPlaceHolder1$FirstName属性的值。

这是生成UniqueID以避免名称重复的方式(应该避免这种情况,因为在Web窗体中我们只能有一个ctl00$ContentPlaceHolder1$LastName标记,因此具有相同{{1}的控件在主页面和表单页面上都有。)

这就是为什么ID无法为您的form对象获取值的原因,它只是找不到已发布的ID'sFormValueProvidertestClass2值形式。

答案 1 :(得分:1)

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

<script>
    $("input[type=text]").each(function () {
         var id = $(this).attr("id");
         $(this).attr("name", id);
    });
</script>