【问题标题】:Dealing with a Large Number of Post Variables ASP.Net处理大量后置变量 ASP.Net
【发布时间】:2012-12-08 09:13:11
【问题描述】:

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

韦德

【问题讨论】:

  • “如果它们不是 asp.net 控件”是什么意思,它们是用户控件吗?另外,“他们甚至存在”是什么意思?如果可能的话,你能把代码贴出来吗?
  • 如果它们是 HTML 控件,例如 select、input、textarea 等...我的意思是如果它们存在,是一个复选框(不是 asp.net 服务器控件)已检查,不会回传到服务器(stackoverflow.com/questions/11424037/…)。所以我不确定代码将如何提供帮助,因为问题是关于处理大量发布值的最佳方式。 HTH。
  • 您是否有可能创建一个代表您的表单字段/数据结构的类。如果是这样,那么为每个表单创建一个这样的类。然后你就知道从你的表格中得到什么了。如果您的复选框没有返回,那么它们是错误的。
  • 一般来说,如果您将 ASP.NET 与 WebForms 一起使用,您也可以使用它带来的功能。这意味着,您将不会使用普通的(不带 runtat=server)HTML 控件,而是始终使用带有 runat=server 的控件,包括 HREF、INPUT 等……所以您不必担心这一切,因为它们将自动配备视图状态(客户端状态在服务器和客户端之间来回移动)
  • 显示一些有问题的示例的简单文本将有助于理解您的意思。

标签: asp.net


【解决方案1】:

对于大型表格,您可以:

  1. 在客户端创建 javascript 对象,将其转换为 JSON 字符串,将 JSON 字符串放入 ASP .NET 控件隐藏或不可见的文本区域;
  2. 提交表单并将 JSON 反序列化为服务器上的对象。

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));
    }
}

安装验证:

PM> 安装包 JQuery.Validation

PM> 安装包 JQuery.Validation.WebForms

【讨论】:

  • 非常有趣的解决方案。你如何处理一个整数字段?我最大的问题是我可能有 10 个整数字段,所以现在我需要解析每个字段,如果成功转换为整数。我想做的是看看实现这一目标的最简单方法是什么。
  • 使用任何验证。例如plugins.jquery.com/validationengine 当你使用 MVC 时,验证已经包含在项目中,只需使用它。等等,我写例子
【解决方案2】:

从某些控件不回发任何值的那一刻起,如果未选中复选框,则您有两个选择。

  1. 了解您在回发前后的所有控件/或
  2. 使用 javascript 创建所有控件的名称并将它们发布回隐藏字段中。

现在,在回帖中,您可以在 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

您可以在此处拆分该字符串,每个名称都用&amp; 分隔,您可以在此处查看使用的内容,未使用的内容。您可以传递有关该控件的其他信息 - 就像我发送每个控件的名称一样。

【讨论】:

  • 我想看看人们如何处理服务器端的东西。我确实知道所有控件,现在我必须触摸每个字段(确保它有一个值,验证它等......),但似乎人们必须找到一种更好的方法来处理这个问题。他们是否创建了一个班级并使用申请表来填写它?我正在寻找这样做的最佳实践。谢谢。
  • @Wade73 我确实使用了一个类,我创建了我想在页面上显示的控件列表,然后我在页面上呈现它们,在回帖中我知道它们并且读取数据。在某些情况下,我将列表保存在视图状态中。对此你有什么想说的?
  • 举个例子就好了。你在课堂上做了什么特别的事情还是只是一个字段列表?
  • @Wade73 抱歉,我延迟重播。我的代码与我的其他模块的连接非常紧密,所以我需要制作它的独立版本并在这里编写,我会尝试在赏金结束之前找到一些时间来做这件事。通常是一个保存、呈现和处理简单 html 控件列表的类。
【解决方案3】:

为每个 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) 的自定义实现。

【讨论】:

    【解决方案4】:

    ASP.NET Webforms 架构不支持多个表单

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

    这将是简单而优雅的

    【讨论】:

    • 我的问题不在于发布,甚至与客户端代码无关。当这些字段发布到服务器时,我正在寻找更好的方法来处理它们。
    • @Wade73,最好的方法是将值映射到 ChiYoung 提到的类。这样一来,您就可以在一个易于管理的地方发布所有变量。
    • 按照建议制作视图模型,并在需要时将表单值映射到具有可空类型的模型。
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多