簡體   English   中英

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

[英]ASP.NET 4.5 TryUpdateModel not picking Form values in WebForm using Master-Page

我正在使用WebForms並且我正在嘗試在Master-Page中執行模型驗證,並且由於某種原因,模型沒有獲取值,這意味着在驗證觸發后如果我輸入一個好的值,模型會不斷回來一遍又一遍地觸發驗證。 如果我將代碼放在沒有母版頁的頁面中,它可以正常工作。 我能夠提供一個非常簡單的例子,老實說,很難相信像MasterPages一樣普遍,到目前為止還沒有人遇到過這種情況。 出於本示例的目的,我將模型嵌入到代碼隱藏中,但外部沒有區別。 任何想法都將受到歡迎。 謝謝。

--master-Page--

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

問題確實是由母版頁的使用引起的。 當在數據綁定控件之外使用時(例如GridViewFormViewMenu等), FormValueProvider期望在Request.Form字典中具有與模型對象中的屬性名稱相同的鍵。

如果您仔細查看生成的HTML,您將看到所有帶有母版頁的表單中的input標簽的name屬性值設置為ctl00$ContentPlaceHolder1$FirstNamectl00$ContentPlaceHolder1$LastName等,而沒有母版頁的表單則name屬性完整且等於control的ID屬性的值。

這是生成UniqueID以避免名稱重復的方式(應該避免這種情況,因為在Web窗體中我們只能有一個form標記,因此在母版頁和表單頁面上都有相同ID's控件)。

這就是為什么FormValueProvider無法獲取testClass2對象的值的原因,它只是找不到發布形式的FirstNameLastNameMiddleName值。

我找到了一個解決方案。您可以編寫一些前端代碼來將name設置為id並且不要忘記將ClientIDMode設置為Static

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM