Recentemente precisei fazer uma manutenção em um projeto Web Forms, no qual não conseguiria usar um controle UpdatePanel pois os campos da tela utilizavam máscaras de alguns plugins bem específicos do jQuery, acabei optando por algo semelhante aos controles e ações do padrão MVC.

No Java Script utilizo o jQuery para serializar os campos e guardá-los em uma variável. Depois faço uma chamada Ajax pelo método POST para a página onde esta o método que precisamos invocar.

var form = $("form").serializeArray();

$.ajax({
    type: "POST",
    url: "Default.aspx/Calcular",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify({ dataForm: form }),
    dataType: "json",
    success: function (objeto) {
        var obj = eval("(" + objeto.d + ")");
        $("#TxtValor3").val(obj.resultado);
    }
});

Após isso criei uma classe que recebe os valores do formulário, nesse caso não fiz usando os controle ASP.NET. Um ponto interessante, poderia ter optado por usar um Dictionary, entretanto, aconteceria um erro caso o formulário tivesse campos repetidos.

public class NameValue
{
    public string Name { get; set; }
    public string Value { get; set; }

    public NameValue() { }
    public NameValue(string name, string value)
    {
        Name = name;
        Value = value;
    }
}

public static class NameValueExtensionMethods
{
    public static string Form(this NameValue[] dataForm, string name)
    {
        var matches = dataForm.FirstOrDefault(nv => nv.Name.ToLower() == name.ToLower());
        if (matches != null)
           return matches.Value;
        return string.Empty;
    }

    public static string[] FormMultiple(this NameValue[] formVars, string name)
    {
        var matches = formVars.Where(nv => nv.Name.ToLower() == name.ToLower()).Select(nv => nv.Value).ToArray();
        if (matches.Length == 0)
            return null;
        return matches;
    }
}

Depois é só colocar um atributo no método e uma modificador de acesso static, para que se esse fique acessível a chamada.

[WebMethod]
public static string Calcular(NameValue[] dataForm)
{
    var valor1 = Convert.ToInt32(dataForm.Form("TxtValor1"));
    var valor2 = Convert.ToInt32(dataForm.Form("TxtValor2"));
    return string.Format("{{resultado:{0}}}", valor1 * valor2);
}

Abraços, até a próxima.

Fonte:

http://www.asp.net/ajaxlibrary/jquery_webforms_Post_Data_To_PageMethod.ashx

Sobre Erick

Erick de Oliveira escreveu 19 artigos no blog.

Tagged with →  
Share →

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>