Mostrando entradas con la etiqueta JSON. Mostrar todas las entradas
Mostrando entradas con la etiqueta JSON. Mostrar todas las entradas

miércoles, 5 de enero de 2022

Mayúsculas, Minúsculas y "Exception: '<' is an invalid start of a value" en ReadFromJsonAsync (Blazor)

 Sintomas

La operación de conversión JSON a Objeto 

_datos = await q.Content.ReadFromJsonAsync<EdiProyecto.Edicion>()

Provoca el error 

"Exception: '<' is an invalid start of a value"

Por experiencia supones que está recibiendo Html en lugar de JSON, revisas la petición

var q = await Http.GetAsync($"API/Proyectos/{Id}");

Escribes en el navegador  loalhost:23234API/proyectos/ 22 y recibes JSON

¿Qué pasa?

Causa y Solución

El nombre de controlador en la URL de WEBAPI debe estar en minúsculas.

var q = await Http.GetAsync($"API/proyectos/{Id}");


jueves, 19 de abril de 2018

Dos Helpers Razor para postear diccionarios en forms y Json

Descripción

El modelo de una página Razor incluye propiedades del tipo diccionario que queremos postear como campos ocultos o mediante Json.

Solución

Para camposOcultos

@helper OcultoDictionary(Dictionary<int, int> dicc, string nombre)
    {
        var i = 0;
        foreach (var d in dicc)
        {
            <input type="hidden" value="@d.Key" name="@string.Format("{0}[{1}].Key",nombre,i)" />
            <input type="hidden" value="@d.Value" name="@string.Format("{0}[{1}].Value",nombre,i)" />
            i++;
        }
}

Ejemplo de resultados

<input type="hidden" value="1" name="ExperienciasEspecificas[0].Key" />
<input type="hidden" value="1" name="ExperienciasEspecificas[0].Value" />
<input type="hidden" value="2" name="ExperienciasEspecificas[1].Key" />
<input type="hidden" value="1" name="ExperienciasEspecificas[1].Value" />
<input type="hidden" value="3" name="ExperienciasEspecificas[2].Key" />
<input type="hidden" value="1" name="ExperienciasEspecificas[2].Value" />

Para Json

@helper JsonDiccionario(Dictionary<int, int> dic, string n)
    {
        var i = 0;
        foreach (var d in dic)
        {
            @Html.Raw($"'{n}[{i}].Key':{d.Key},")
            @Html.Raw($"'{n}[{i}].Value':{d.Value},")
            i++;
        }
}

Ejemplo de resultados

{
...
'ExperienciasEspecificas[0].Key':1,
'ExperienciasEspecificas[0].Value':1,
'ExperienciasEspecificas[1].Key':2,
'ExperienciasEspecificas[1].Value':1,
'ExperienciasEspecificas[2].Key':3,
'ExperienciasEspecificas[2].Value':1,
...
}

viernes, 6 de julio de 2012

Desarrollo de un servicio json sobre ASP.NET para consumo desde Jquery

Enunciado:

Necesitamos un servicio web que responda en formato JSON para poderlo leer desde Jquery.

En este ejemplo partiremos del resultado otro servicio web WCF "directorio", pero podríamos estar devolviendo los resultados de una consulta linq o cualquier otra fuente serializable

Solución

Añadir un Servicio WCF con AJAX habilitado.
IMPORTANTE: En el Web.config sección system.servicemodel ELIMINAR o comentar las referencias a este servicio  . En mi caso que el servicio se llamaba MAC eliminé las líneas: el behavior  enablewebScript


      
        
             
            
      
      
    
    
    
      
        
      
    

Luego editamos el archivo de etiquetado (.svc) añadiendo el atributo Factory apundando a la clase System.ServiceModel.Activation.WebServiceHostFactory.
<%@ ServiceHost Language="VB" Debug="true" Service="myAplication.MAC" CodeBehind="MAC.svc.vb" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
En el archivo de código MAC.svc.vb definiremos los metodos con el atributo WebInvoke especificando el método (GET o POST) y el formato de la respuesta (JSON).
Imports System.ServiceModel
Imports System.ServiceModel.Activation
Imports System.ServiceModel.Web



Public Class MAC

    
    
    Public Function NomIdEmpresa(term As String) As directorio.EmpresaIdentificada()
        'ahora llamo a la clase proxy de mi servicio WCF.
        Dim servicio = New directorio.IdirectorioClient
        Dim resultado As directorio.EmpresaIdentificada() = servicio.SugerenciasNombreIdEmpresa(term, 20) 
        servicio.Close()
        Return resultado
    End Function
End Class