2012-12-20 102 views
5

我遇到了一個問題,其中包含多個控件(20-40)。問題是,當我處理回發時,我需要將它們的值放入變量中,如果它們不是asp.net服務器控件(即選擇,輸入等等),我有時需要確保它們存在。所以,如果我有一個沒有選中的純html複選框,它不會被髮布到服務器,您需要檢查它的存在,然後才能獲得它的價值。之後,我需要將它們傳遞給保存到數據庫的方法。該方法處理我所有的粗俗和業務驗證。設置這個過程非常乏味,非常耗時。人們在做什麼來處理這個問題?我正在使用ASP.Net 4.0 Web窗體和VB.Net。一個想法是將http上下文傳遞給方法,並讓方法中的代碼查找值。儘管如此,解決方案似乎並不好。任何建議真的會被讚賞,因爲我知道我不是唯一一個遇到這個問題的人。提前致謝。處理大量的帖子變量ASP.Net

韋德

+3

你的 「如果他們不asp.net控制」 意味着什麼,他們是用戶控制嗎?另外,「他們甚至存在」是什麼意思?如果可能,你可以發佈代碼嗎? – Nexus23

+0

如果它們是HTML控件,比如select,input,textarea等等...我的意思是,如果它們存在,那麼沒有被檢查的複選框(而不是asp.net服務器控件)將不會被髮布回到服務器(http://stackoverflow.com/questions/11424037/does-input-type-checkbox-only-post-data-if-its-checked)。所以我不確定代碼會如何幫助,因爲問題是處理大量已發佈值的最佳方法。 HTH。 – Wade73

+1

您是否有可能創建一個代表您的表單域/數據結構的類。如果是這樣,那麼爲每個表單創建一個這樣的類。然後你就知道你的表單期待什麼。如果你的複選框沒有被返回,那麼它們是錯誤的。 – ChiYoung

回答

2

對於大型表單,您可以:

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

enter image description here

enter image description here

安裝驗證:

PM>安裝,包裝JQuery.Validation

PM>安裝,包裝JQuery.Validation.WebForms

+0

非常有趣的解決方案。你如何處理整數字段?我最大的問題是我可能有10個整數字段,所以現在我需要解析每個字段,如果成功轉換爲整數。我想要做的是看看完成這個最簡單的方法。 – Wade73

+0

使用任何驗證。例如http://plugins.jquery.com/validationengine/ 當你使用MVC時,驗證已經包含在項目中,就使用它。等等,我編寫示例 –

+0

準備就緒,包含驗證 –

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 

在那裏你可以拆分該字符串,每個名字都與&分開,在那裏你可以看到什麼是使用,什麼不是。您可以傳遞有關該控件的其他信息 - 就像我發送每個控件的名稱一樣。

+0

我期待看到人們如何處理服務器端的東西。我知道所有的控制,現在我必須觸及每個領域(確保它有一個值,驗證它等),但似乎人們必須找到更好的方法來處理這個問題。他們是否創建了一個類並使用請求表單來填充它?我正在尋找這樣做的最佳做法。謝謝。 – Wade73

+0

@ Wade73我確實使用了一個類,我創建了我想要在頁面上顯示的控件列表,然後將它們呈現在頁面上,並且在發佈後我知道它們並讀取數據。在某些情況下,我將列表保存在視圖狀態中。你想說些什麼呢? – Aristos

+0

一個例子會很好。你在課堂上做了一些特別的事,還是隻是一個領域的列表? – Wade73

0

如果您已經創建了具有多種形式,那麼我建議使用jQuery和郵政個人形式向尊敬的處理程序處理該請求的頁面的ASP.NET Web表單拱不支持多種形式

這將是簡單而優雅

+0

我的問題不在於發佈甚至與客戶端代碼有關。我正在尋找更好的方式來處理這些字段,當它們發佈到服務器。 – Wade73

+0

@ Wade73,最好的方法是像ChiYoung提到的那樣將值映射到一個類。這樣你就可以輕鬆管理所有變量。 –

+0

按照建議製作視圖模型,並根據需要將表單值映射到具有可空類型的模型。 –

1

對於每個Web表單創建具有的所有字段MA的公共屬性模型類你在形式上。創建名稱,驗證和默認值屬性並將其應用於屬性。在回發期間,找出需要的模型類,創建實例,迭代其公共屬性並應用:如果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(奧德爾)的自定義實現。