处理大量的后期变量ASP.Net

时间:2012-12-20 19:28:29

标签: asp.net

我遇到了一个问题,我有多个表单,上面有许多控件(20-40)。问题是当我处理回发时,我需要将它们的值放入变量中,如果它们不是asp.net服务器控件(即选择,输入等等),我有时需要确保它们甚至存在。所以,如果我有一个未选中的普通html复选框,它将不会发布到服务器,你需要检查它的存在,然后才能获得它的值。之后我需要将它们传递给保存到数据库的方法。该方法处理我的所有crud和业务验证。设置它是最乏味和非常耗时的。人们在做什么来处理这个问题?我正在使用ASP.Net 4.0 Web表单和VB.Net。一种想法是将http上下文传递给方法,并让方法中的代码查找值。不过,似乎并不是一个好的解决方案。我真的很感激任何建议,因为我知道我不是唯一一个遇到这个问题的人。提前谢谢。

瓦德

4 个答案:

答案 0 :(得分:2)

对于大型表格,您可以:

  1. 在客户端上创建javascript对象,将其转换为JSON字符串,将JSON字符串放到ASP .NET控件中隐藏或隐藏textarea;
  2. 提交表单并将JSON反序列化为服务器上的对象。
  3. <强> Default.aspx的

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <script src="Scripts/jquery-1.9.1.min.js" type="text/javascript"></script>
        <script src="Scripts/jquery.validate.min.js" type="text/javascript"></script>
        <script src="Scripts/jquery.validation.net.webforms.min.js" type="text/javascript"></script>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:HiddenField runat="server" ID="Hidden1" />
        <input type="checkbox" id="CheckBox1" checked />
        <input type="checkbox" id="CheckBox2" />
        <input type="text" id="text1" name="text1" value=""/>
        <asp:Button runat="server" Text="Button" ID="Button1" OnClientClick="createJSON()" OnClick="Button1_Click" />
        <script type="text/javascript">
    
            function createJSON() {
                $('#Hidden1').val(JSON.stringify({
                    field1: $('#CheckBox1').is(':checked'),
                    field2: $('#CheckBox2').is(':checked'),
                    field3: $('#text1').val()
                }));
            }
    
            $(document).ready(function () {
                $("#form1").validate({
                    onsubmit: false,
                    rules: {
                        text1: {
                            required: true,
                            digits: true
                        }
                    }
                });
    
                $("#Button1").click(function (evt) {
                    var isValid = $("#form1").valid();
                    if (!isValid) evt.preventDefault();
                });
            });
        </script>
        </form>
    </body>
    </html>
    

    <强> Default.aspx.cs

    using System;
    using System.Web.Script.Serialization;
    
    public class myClass
    {
        public bool field1;
        public bool field2;
        public string field3;
    }
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            var result = (myClass)(new JavaScriptSerializer()).Deserialize(Hidden1.Value, typeof(myClass));
        }
    }
    

    enter image description here

    enter image description here

    安装验证:

    PM&GT; Install-Package JQuery.Validation

    PM&GT; Install-Package JQuery.Validation.WebForms

答案 1 :(得分:1)

从某些控制它们没有回发任何值的那一刻起,如果没有选中复选框,你有两个选择。

  1. 了解回帖之前和之后的所有控件/或
  2. 使用javascript创建控件的所有名称,并将它们发布回隐藏字段。
  3. 现在,在帖子后面,您可以在HttpContext.Current.Request.Form上找到所有已发布的值,您可以在其中全部阅读。

    在客户端,您可以使用简单的javascript或jQuery创建所有输入控件的列表,并在隐藏的输入上发送它们。这是一个例子:

    var inputs, index, cNames = ""; 
    inputs = document.getElementsByTagName('input');
    for (index = 0; index < inputs.length; ++index) {
        cNames += "&" + inputs[index].name;
    }   
    
    document.getElementById("AllControls").value = cNames;
    

    或与jQuery相同

        var cAllNames = "";
        $('input').each(function() {
            cAllNames += "&" + $(this).attr("name");
        });
        jQuery('#AllControls').val(cAllNames);
    

    在您的页面上,您有一个隐藏的控件,如

    <input type="hidden" name="AllControls" id="AllControls" />
    

    在帖子上,您可以将控件的所有名称放在以下行中:

    AllControls=&__VIEWSTATE&__EVENTVALIDATION&cbBoxTest&AllControls&Button1
    

    在那里,您可以拆分该字符串,每个名称都与&分开,在那里您可以看到使用的是什么,什么不是。您可以传递有关该控件的其他信息 - 与我发送每个控件的名称相同。

答案 2 :(得分:1)

对于每个Web表单,创建一个具有公共属性的模型类,其中包含表单上可能包含的所有字段。创建名称,验证和默认值属性并将其应用于属性。在回发期间,找出需要的模型类,创建实例,迭代其公共属性并应用:如果post具有属性名称的字段 - 验证该值并应用于该字段,如果不是 - 应用默认值。有点像(我会用c#,但我想这很清楚)

MyCrudModelForSomeForm {
    [MyWebFormField(Default = 42, Type = typeof(int), Name = "txtAmount")]
    public int SomeInt { get; set; }
    [MyWebFormField(Default = "Hello", Type = typeof(string), Name = "txtMessage", Validate = "$[A-Z]{6}^")]
    public string SomeString { get; set; }
    [MyWebFormField(Default = "Zimbabwe", Type = typeof(string), Name = "txtCountryChoice")]
    public string SomeOtherString { get; set; }
}

这基本上是MVC概念中M(odel)的自定义实现。

答案 3 :(得分:0)

ASP.NET Webforms arch不支持多种表单

如果您创建了一个包含多个表单的页面,那么我建议使用jQuery和Post Individual表单到受尊重的处理程序来处理请求

这将简单而优雅