Infragistics. Refresh igCombo after source was updated

Partimos de un proyecto ASP.NET MVC en el que tenemos en una vista un combo, que tras mostrarse en la página y por cualquier motivo, ha modificado su datasource y queremos que éste se refresque al hacer clic en un botón.

¿Cómo refrescamos el combo (en este caso es de Infragistics, pero el sistema sería similar para otros)?

En nuestra View tendríamos algo tal que así:

 

Este sería el script que se encarga de que cuando el usuario hace clic en el botón de “refresh”, la vista se comunique con el controlador, para que éste le devuelve el json del nuevo datasource.

 

<script>

$(function () {

$(“#actividad-refresh”)

.button()

.click(function (event) {

 

$.getJSON(“/EmpresaArea/Empresa/GetActividades”, function (returnData) {

$(“#IdActividad”).igCombo(“option”, “dataSource”, returnData);

});

});

});

</script>

 

Este sería el botón que refrescaría el datasource del combo:

<a
href=”#”
id=”actividad-refresh”><i
class=”icon-refresh”></i></a>

 

Este sería el combo, que se carga inicialmente con un datasource, que posteriormente se refrescará al hacer clic en el botón anterior.

 


@(Html.Infragistics().ComboFor(x => x.IdActividad ).Width(“100%”).DataSource( Model.Actividades )

 

.TextKey(“Nombre”).ValueKey(“Id”).DataBind().Render())

 

Y nuestro controlador:

 

[HttpGet]


public
string GetActividades()

{


var actividades =new
List<ComboItems>();

 


var lst = _repository.All<Actividad>();

 


foreach (var l in lst)

actividades.Add(new ComboItems { Id = l.id_Actividad, Nombre = l.Nombre });

 


var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();


return oSerializer.Serialize(actividades);

}

 

Y nuestro ViewModel:

 

public
int? IdActividad { get; set; }

public
List<ComboItems> Actividades { get; set; }

 

public
class
ComboItems

{


public
string Nombre { get; set; }


public
int Id { get; set; }

 

}

Infragistics. “Can not establish a connection With The Report Server.”

Desde este blog quiero dar las gracias al soporte técnico de Infragistics. Nos ha costado dar con la solución, pero finalmente hemos podido mostrar nuestro informe con el visor de HTML 5 que esta empresa proporciona a sus clientes para desarrollos con ASP.Net MVC y jQuery.

  1. Principalmente el problema era que mi proyecto que tan solo debía mostrar un informe en el navegador, lo hacía perfectamente cuando estaba en desarrollo, pero cuando lo subía al servidor IIS, siempre me daba el error “Can not establish a connection With The Report Server.”
  2. Mis dudas iniciales fueron:
    1. Quizás sea por usar IIS 8?
    2. Quizás porque el servidor es un Windows 2012?
    3. O tal vez problemas con los endpoints en Azure?
    4. O el framework 4.5?
  3. Me puse en contacto con soporte de Infragistics, y el primer técnico me paso un par de enlaces, que no tenían mucha chicha.
  4. Me pasaron a otro técnico, también me mando una ayuda, pero que tampoco resolvió el problema. Pero el técnico posteriormente me hizo una pregunta importante. “¿funciona el WCF en el propio servidor?”. Bien, aquí empezaba lo bueno. Los informes necesitan de un servicio WCF, y vaya, IIS 8 viene con estos servicios “disabled”.
  5. Por tanto, primer paso, activarlos.
  6. Ya pudiendo acceder al .svc (http://localhost/reporting/ReportService1.svc), tan solo quedaba probar el informe y esperar que todo fuera ok.
  7. No fue así, ya con otro técnico (el tercero) me indica que las .dll que se añaden al proyecto en desarrollo, no son todas las necesarias para que el informe se muestre (http://help.infragistics.com/NetAdvantage/reporting/2013.1/CLR4.0?page=Assemblies_Needed_for_Distribution.html) Hay tres .dll, que no se añaden automáticamente al proyecto, pero sí que son necesarias:

InfragisticsWPF4.Reports.Controls.Common.v13.1.dll

InfragisticsWPF4.Reports.Controls.Charts.XamDataChart.v13.1.dll

InfragisticsWPF4.Reports.Controls.DataVisualization.v13.1.dll

  1. Las añado, y por fin, FUNCIONA!
  2. Pero CUIDADO, funciona si llamo al informe mediante HTTP, pero si lo hago mediante HTTPS, NO VA! Es decir, http://xxxx.es/home/report => funciona, pero https://xxxx.es/home/report => no funciona (error “Can not establish a connection With The Report Server.”)
  3. Aquí es donde empieza a complicarse la cosa, tras 20 días de dimes y diretes, el técnico me envía la solución, la cual plasmo tal cual para todos aquellos que os encontréis con el mismo problema:

1)      You need to change the service endpoint for the serviceEndpointUri to point to the https endpoint you want to use.

//for https

    var serviceEndpointSecure = “https://localhost:44300/ReportService1.svc/ajaxAddress/&#8221;;

 
 

 
 

2)      You’ll need to change the configurations in the webconfig to add an endpoint that allows https. Here are the detailed steps.

2.1)Define an endpoint with the same address which you’ll use as the service endpoint url:

<endpoint address=https://localhost:44300/ReportService1.svc/ajaxAddress

          binding=webHttpBinding name=webHttpBinding

contract=Infragistics.Reports.Server.IReportProcessorService

bindingConfiguration=TransportwebHttpBinding behaviorConfiguration=JsonFaultBehavior  >

2.2)Define the webHttpBinding:

<webHttpBinding>

        <binding name=TransportwebHttpBinding>

          <security mode=Transport>

          </security>

        </binding>

      </webHttpBinding>

 
 

Note that the bindingConfiguration from the endpoint should match with the binding’s name. In this case we need a binding with security mode set to transport.

 
 

2.3) EndPoint behavior. The service usually adds this automatically however note the JsonFaultBehavior there:

 
 

<endpointBehaviors>

        <behavior name=SilverlightFaultBehavior>

          <silverlightFaults />

        </behavior>

        <behavior name=JsonFaultBehavior >

          <enableWebScript />

          <webHttp/>

          <jsonFaults  />

        </behavior>

      </endpointBehaviors>

 
 

It will be the behaviorConfiguration for the endpoint that will be used.

 
 

 
 

If you want to allow normal http requests you’ll need to have a separate endpoint for them. For example:

<endpoint address=ajaxAddress behaviorConfiguration=JsonFaultBehavior

         binding=webHttpBinding contract=Infragistics.Reports.Server.IReportProcessorService />

 
 

In which case the serviceEndpointUri needs to point to that endpoint. For example:

//for http

    var serviceEndpoint = http://localhost:26224/ReportService1.svc/ajaxAddress/&#8221;;

 

Muchas gracias Maya Kirova, ya que sin ti, hubiera sido difícil dar con la solución, y también dar las gracias al resto de técnicos que poco a poco fueron abriéndome los ojos.

Pero sí quiero dar un tirón de orejas al señor de Infragistics que en este post http://www.infragistics.com/community/blogs/damyan_petev/archive/2012/07/24/html5-report-viewer-taking-your-reports-further.aspx dice literalmente:

The Web Application

To use the HTML5 viewer you would need to host it and the resources described above(copy the ‘js’ folder to your project). One you have that add a reference to the report class library project. Also using the Add > New Item.. menu choose Infragistics > Reporting > Infragistics Report Service and add that to your project as well. Doing that will add all the required references as well register http handler for the resources, service endpoints and a few other settings. The service will be the main star of your reporting solution and will create reports, manage sessions and provide recourses for the viewer. And you don’t need to write any code for that!

 

Está claro, que para que funcionen los informes, hace falta un poquito más de ayuda, sobre todo si se necesita que funcionen mediante SSL.

J