我遇到了一个问题,我有多个表单,上面有许多控件(20-40)。问题是当我处理回发时,我需要将它们的值放入变量中,如果它们不是asp.net服务器控件(即选择,输入等等),我有时需要确保它们甚至存在。所以,如果我有一个未选中的普通html复选框,它将不会发布到服务器,你需要检查它的存在,然后才能获得它的值。之后我需要将它们传递给保存到数据库的方法。该方法处理我的所有crud和业务验证。设置它是最乏味和非常耗时的。人们在做什么来处理这个问题?我正在使用ASP.Net 4.0 Web表单和VB.Net。一种想法是将http上下文传递给方法,并让方法中的代码查找值。不过,似乎并不是一个好的解决方案。我真的很感激任何建议,因为我知道我不是唯一一个遇到这个问题的人。提前谢谢。
瓦德
答案 0 :(得分:2)
对于大型表格,您可以:
<强> 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&GT; Install-Package JQuery.Validation
PM&GT; Install-Package JQuery.Validation.WebForms
答案 1 :(得分:1)
从某些控制它们没有回发任何值的那一刻起,如果没有选中复选框,你有两个选择。
现在,在帖子后面,您可以在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表单到受尊重的处理程序来处理请求
这将简单而优雅