【问题标题】:ASP.NET 4.5 TryUpdateModel not picking Form values in WebForm using Master-PageASP.NET 4.5 TryUpdateModel 未使用 Master-Page 在 WebForm 中选取表单值
【发布时间】:2014-07-27 18:40:53
【问题描述】:

我正在使用 WebForms,我正在尝试在母版页中执行模型验证,但由于某种原因,模型没有获取值,这意味着如果我输入一个好的值,验证触发后,模型会继续出现回空,因此一遍又一遍地触发验证。如果我将代码放在没有母版页的页面中,它可以正常工作。我能够举一个非常简单的例子,老实说,很难相信像 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>

-- 网络表单--

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

【问题讨论】:

  • 任何偶然发现这个问题的人以及以下两个答案的答案都将帮助您实现所需的目标。

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


【解决方案1】:

我找到了解决办法。你可以写一点前端代码来设置name等于id,别忘了把ClientIDMode设置为Static

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

【讨论】:

    【解决方案2】:

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

    如果您仔细查看生成的 HTML,您会发现带有母版页的表单中的所有 input 标记都将 name 属性值设置为 ctl00$ContentPlaceHolder1$FirstNamectl00$ContentPlaceHolder1$LastName 等,而没有表单母版页保留 name 属性不变,并等于控件的 ID 属性的值。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多