5

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

韦德

4

4 回答 4

2

对于大型表格,您可以:

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

默认.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>

默认.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

于 2013-03-14T15:09:19.730 回答
1

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

  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

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

于 2013-03-08T01:22:49.620 回答
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) 的自定义实现。

于 2013-03-14T13:40:56.463 回答
0

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

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

这将是简单而优雅的

于 2013-03-12T07:17:43.297 回答