2012-12-20 13 views
5

Występuje problem, w którym mam wiele formularzy z wieloma kontrolkami (20-40). Problem polega na tym, że kiedy obsługuję odświeżenie, muszę umieścić ich wartości w zmiennych i jeśli nie są to kontrole serwera asp.net (tj. Wybieranie, wprowadzanie itp.), Czasami muszę się upewnić, że one istnieją. Tak więc, jeśli mam zaznaczone pole wyboru HTML, które nie jest zaznaczone, nie zostanie wysłane do serwera i trzeba sprawdzić jego istnienie, zanim będzie można uzyskać jego wartość. Następnie muszę przekazać je do metody zapisywania w bazie danych. Metoda obsługuje wszystkie moje sprawdzanie firmowe i biznesowe. Ustawienie to jest w najlepszym wypadku nużące i bardzo czasochłonne. Co ludzie robią, aby sobie z tym poradzić? Używam formularzy sieci Web ASP.Net 4.0 i VB.Net. Jedną z nich było przekazanie kontekstu http do metody i pozostawienie kodu w metodzie do szukania wartości. Nadal nie wydaje się, że dobre rozwiązanie. Każda rada byłaby naprawdę doceniona, ponieważ wiem, że nie jestem jedynym, który wpadł na ten problem. Z góry dziękuję.Praca z dużą liczbą zmiennych pocztowych ASP.Net

Wade

+3

Co masz na myśli mówiąc "jeśli nie są one asp.net kontrole" , czy to kontrole użytkownika? Co masz na myśli mówiąc "oni nawet istnieją"? Czy możesz opublikować kod, jeśli to możliwe? – Nexus23

+0

Jeśli są to elementy sterujące HTML, takie jak select, input, textarea, etc ... Co mam na myśli, jeśli istnieją, to pole wyboru (nie kontrola serwera asp.net), które nie zostało sprawdzone, nie zostanie wysłane z powrotem na serwer (http://stackoverflow.com/questions/11424037/does-input-type-checkbox-only-post-data-if-its-checked). Nie jestem więc pewien, w jaki sposób pomoże kod, ponieważ chodzi o najlepszy sposób na obsługę dużej ilości zaksięgowanych wartości. HTH. – Wade73

+1

Czy masz możliwość utworzenia klasy reprezentującej twoje pola formularzy/strukturę danych. Jeśli tak, to utwórz dla każdej formy taką klasę. Wtedy wiesz, czego oczekiwać od twojej postaci. Jeśli twoje pola wyboru nie zostaną zwrócone, wówczas są one fałszywe. – ChiYoung

Odpowiedz

2

przypadku dużych form, można:

  1. utworzyć javascript obiekt na klienta, przekształcić ją w ciąg JSON, umieścić JSON ciąg do kontroli ASP .NET ukryte lub niewidoczne textarea;
  2. przesłać formularz i deserializować JSON do obiektu na serwerze.

Defalult.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

Install walidacji:

PM> Install-Package JQuery.Validation

JQuery.Validation.WebForms

PM> Install-Package

+0

Bardzo interesujące rozwiązanie. Jak radzisz sobie z polem całkowitym? Moim największym problemem było to, że mogę mieć 10 pól liczb całkowitych, więc teraz muszę przeanalizować każde pole i jeśli uda się przekonwertować na liczbę całkowitą. Co próbuję zrobić, to zobaczyć, jak najprościej to osiągnąć. – Wade73

+0

użyj jakiejkolwiek weryfikacji. na przykład http://plugins.jquery.com/validationengine/ Podczas korzystania z MVC, sprawdzania poprawności uwzględnionego już w projekcie, po prostu go użyj. Czekaj, piszę przykład –

+0

gotowy, sprawdzanie poprawności włączone –

1

Od tej chwili, że niektóre kontrole nie post Powrót dowolną wartość, podobnie jak pole wyboru, jeśli nie jest zaznaczone, masz dwie opcje.

  1. znać wszystkie swoje kontroli przed i po postu powrót/lub
  2. Tworzenie z javascript wszystkie imiona kontroli i zamieszczać je w ukrytym polu.

Teraz, po odesłaniu masz wszystkie opublikowane wartości na HttpContext.Current.Request.Form, gdzie możesz je wszystkie przeczytać.

Po stronie klienta można użyć prostego javascript lub jQuery, aby utworzyć listę wszystkich elementów sterujących wprowadzania danych i wysłać je na ukryte dane wejściowe. Oto przykład:

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

document.getElementById("AllControls").value = cNames; 

lub samo z jQuery

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

i na swojej stronie masz ukrytą kontrolę jak

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

i na stanowisku masz wszystkie nazwy elementów sterujących w linii:

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

Tam można podzielić ten ciąg, każde nazwisko jest oddzielone od &, i tam można zobaczyć, co jest używane, a co nie. Możesz przekazać dodatkowe informacje o tych kontrolkach - w taki sam sposób, w jaki wysyłam imiona każdego z nich.

+0

Szukam, jak ludzie zajmują się tym po stronie serwera. Znam wszystkie kontrole i teraz muszę dotknąć każdego pola (upewnić się, że ma wartość, potwierdzić to itp.), Ale wygląda na to, że ludzie musieli znaleźć lepszy sposób na radzenie sobie z tym. Czy tworzą klasę i wypełniają ją za pomocą formularza wniosku? Poszukuję najlepszej praktyki, aby to zrobić. Dzięki. – Wade73

+0

@ Wade73 Używam klasy, w której tworzę listę kontrolek, które chciałbym pokazać na stronie, a następnie renderuję je na stronie, a na liście z powrotem znam je i odczytuję dane. W niektórych przypadkach zapisuję listę w stanie widoku. Co lubisz powiedzieć o tym? – Aristos

+0

Przykład byłby miły. Czy robisz coś specjalnego w klasie, czy jest to tylko lista pól? – Wade73

0

środowiska ASP.NET Webforms arch nie obsługuje wielu form

Jeśli utworzono stronę, która ma wiele form, a następnie proponuję użyć formularza jQuery i post indywidualny dla szanowanego obsługi przetwarzania żądania

To będzie prosty i elegancki

+0

Moim problemem nie jest wysyłanie wiadomości, a nawet cokolwiek związanego z kodem strony klienta. Szukam lepszych sposobów na obsługę tych pól, gdy są one wysyłane na serwer. – Wade73

+0

@ Wade73, najlepszym sposobem jest odwzorowanie wartości na klasę, o której wspomniał ChiYoung. W ten sposób masz wszystkie opublikowane zmienne w jednym łatwym do zarządzania miejscu. –

+0

Utwórz model widoku zgodnie z sugestią i zamapuj wartości formularza na model z odpowiednimi typami zerowymi. –

1

Dla każdego formularza internetowego utworzyć klasę modelu, który ma właściwości wiadomości wszystkie pola, które ma y być w formularzu. Utwórz atrybuty name, validation i default value i zastosuj je do właściwości.Podczas odświeżania strony sprawdź, jaka klasa modelu jest potrzebna, stwórz instancję, iteruj jej właściwości publiczne i zastosuj: jeśli post ma pole z nazwą właściwości - sprawdź poprawność wartości i zastosuj do tego pola, jeśli nie - zastosuj wartość domyślną. Coś podobnego (użyję C#, ale myślę, że to oczywiste, w każdym razie)

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

To w zasadzie realizacja zwyczaj M (Odel) od koncepcji MVC.

Powiązane problemy