none
Pasar parámetros a pagina parcial en Librería de Clases Razor RCL NET Core RRS feed

  • Question

  • Hola, en relación con este hilo: Net Core equivalente a User Control

    Pues que tras investigar bastante llegué a la conclusión de que lo que necesitaba hacer era una Librería de Clases Razor (Razor Class Library) que se puede reutilizar como proyecto independiente, puede contener recursos estáticos (css, js...) y tiene pseudo MVC con una página razor con un modelo asociado a ella y un pseudo controlador, vamos todo lo necesario para poder crear un UserControl. Y con ello me puse.

    Pero resulta que ahora me encuentro con un escollo, no sé cómo pasarle parámetros a una de estas Razor Pages si la cargo como parcial, que es lo que necesito. En varios sitios te cuentan como hacerlo como hipervínculo y cargar la Razor Page completa:

    https://www.learnrazorpages.com/razor-pages/routing

    Trabajamos con .NET Core 3.1. Mi Razor Page está en el directorio "\Pages" y en el subdirectorio "\Shares"

    He probado a pasarlo como modelo, tal y como suguieren aquí: https://www.learnrazorpages.com/razor-pages/model-binding  pero me da un error.

    Razor Page en la RCL ->

    cshtml.cs:

    namespace SpatialUnitsRclTest.Pages.Shared
    {
        public class _SpatialTestModel : PageModel
        {
            [BindProperty(SupportsGet = true)]
            public string NameTest { get; set; }
    
            public void OnGet(string nameTest)
            {
                // hacer algo con los parámetros y crear el viewmodel de la Razor Page...
            }
        }
    }

    cshtml de la página Razor Page en la RCL:

    @page
    @model SpatialUnitsRclTest.Pages.Shared._SpatialTestModel
    <h5>Test RCL partial @Model.NameTest</h5>
    <div id="mapid" style="min-height: 180px;"></div>

    View (cshtml) en el proyecto Web MVC que lleva la parcial del RCL ->

    <div style="height: 200px; width: 200px;">
        @{ var partialModel = new SpatialUnitsRclTest.Pages.Shared._SpatialTestModel { NameTest = "pruebaaaaaaaaaaa" }; }
        <partial name="_SpatialTest" model="@partialModel"  />
    </div>


    ¿¿¿Alguien tiene idea de cómo podría hacerlo???

    Muchas gracias. Saludos, Héctor.


    Wednesday, February 12, 2020 4:55 PM

Answers

  • hola

    La verdad no conozco en profundidad este tipo de encapsulado en asp.net core, mas que nada porque las view las suelo desarrollar en Angular y del lado del servidor lo implemento como webapi

    Pero si analizo

    Crear una interfaz de usuario reutilizable mediante el proyecto de biblioteca de clases de Razor en ASP.NET Core

    en la primer parte indica que una Razor Class Library puede aplicarse con View Component

    >>parece que una RCL con RazorPages es más "portable" entre proyectos que es lo que necesito y hace más o menos lo mismo que un ViewComponent,

    pero une ambos, entiendo puedes poner un View Component en el RCL

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marked as answer by sanmolhec Monday, February 17, 2020 9:03 AM
    Thursday, February 13, 2020 2:14 PM
  • Hola una vez más.

    Ya probé tu idea, Leandro, y efectivamente con un ViewComponent -VC- dentro de una Razor Class Library -RCL- (componente de vista en una Librería de clases Razor) la cosa funciona adecuadamente.

    Se puede crear un llamémoslo "componente web" reusable que puedes incluir en cualquier proyecto y cuyo código está centralizado. Puede ser casi todo lo complejo que se te ocurra, con js, css y otros estáticos (solo tener en cuenta cómo hay que referenciarlos en los proyectos /_content/{nombre librería}/js/...) un una parte de Back dentro del VC de la RCL y una parte View en la vista Default del VC de la RCL.

    Y otra cosa que hay que tener en cuenta es el orden de carga de las distintas partes de los proyectos (Controlador proyecto contenedor, vista contenedora, back del VC en la RCL, vista del VC, _Layout del proyecto contenedor) y cuando y donde se ha cargado jQuery para poderlo utilizar.

    Gracias por la ayuda y espero que pueda servir a más gente.

    Saludos, Héctor.

    • Marked as answer by sanmolhec Monday, February 17, 2020 9:03 AM
    Monday, February 17, 2020 9:03 AM

All replies

  • hola

    >>tiene pseudo MVC con una página razor con un modelo asociado a ella y un pseudo controlador, vamos todo lo necesario para poder crear un UserControl.

    no entiendo, eso de "pseudo" no existen y el concepto de User Control aun menos

    Si queria encapular funcionalidad lo que debes desarrollar es un Helper o un View component

    View components in ASP.NET Core

    View Components in Razor Pages

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Wednesday, February 12, 2020 5:53 PM
  • Hola, ante todo gracias por la respuesta.

    Aclarar que intento siempre dejar las cosas más o menos claras siendo lo más escueto posible, cosa que me cuesta conseguir :) y que a veces me lleva a simplificar demasiado o no aclarar bien algún concepto.

    En este caso, discrepo con lo que me comentas e intento aclarlo para explicarlo mejor.

    Cuando digo pseudo MVC lo digo porque las Páginas Razor tienen una parte de vista y una de "controlador pegado" a ellas con los métodos OnGet, OnPost y algún otro, vamos que hay parte de vista y parte de BackEnd.  Por eso lo de "pseudo MVC" proque actúan más o menos igual que MVC pero no lo es ni mucho menos.

    En un proyecto Razor Class Library (RCL), hasta donde he podido entender, se puede meter contenido estático como CSS, JS, imágenes... páginas razor con este funcionamiento con Vista y Back, todos los servicios necesarios que quieras usar desde el back, acceso a bbdd... y al final se puede referenciar en otro proyecto web, utilizando esas páginas y ese contenido estático, con lo que es altamente reutilizable en otros proyectos, de ahí que haya dicho que es similar a un UC antiguo (o al menos yo le veo esa similitud, puesto que tienes todo lo necesario para poder hacer un "control web" -vista, back, js, css- y es reutilizable en otros sitios puesto que es independiente). Además se puede empaquetar como un nuguet, creo.

    Con ViewComponents o TagHerlpers también se pueden hacer cosas parecidas ("tipo UC") a la hora de encapsular pero con matices (sobre todo si es entre proyectos y no dentro de un único proyecto):

    - El primer matiz, y fundamental, es que una RCL puede referenciarse en varios proyectos y con cambiarlo en un sitio, recompilando el resto estará actualizado en todos. Mientras que los Tag o los VC están en un proyecto y si te los quieres llevar a otros tendrás que copiar y pegar todo el código y los cambios replicarlos en todos esos proyectos.

    - El segundo que un TagHelper en NET Core no tiene parte de vista -o yo no lo he encontrado- y todo el contenido que queramos generar de front lo tendremos que hacer desde el back, y esto no es muy cómodo para páginas complejas.

    - El tercero, que un ViewComponent utiliza los estáticos del proyecto donde está, con lo que volvemos al primer matiz pero con más complicaciones porque hay que llevarse el código del VC y todos los estáticos que necesites al resto de proyectos.

    Pensemos que queremos crear unos componentes de login y alta de usuarios y gestión de cuenta de usuarios. Lo lógico parece a priori hacerlo con un VC, es verdad, pero eso es si sólo se va a utilizar en una aplicación, si lo tuviésemos que usar en 15 aplicaciones distintas y algunas alojadas inluso en distintos servidores... (me diréis que use un token y que redirija a la app donde esté el login, pero es que en mi caso concreto no es un login y ese "control" debe estar como una parte dentro de muchas de las páginas de distintas aplicaciones.

    Resumiendo: parece que una RCL con RazorPages es más "portable" entre proyectos que es lo que necesito y hace más o menos lo mismo que un ViewComponent, que es lo más cercano a un UC antiguo (que para nada digo que lo sea, pero es con lo que te puedes acercar).

    Y una vez aclarado lo que expuse en el primer mensaje del hilo, sigo con el problema de no poder enviar parámetros a la Razor Page de la RCL cuando la cargo como una parcial, a ver si me podéis echar un cable con esto.

    Muchas gracias y saludos, Héctor.

    Thursday, February 13, 2020 7:27 AM
  • hola

    La verdad no conozco en profundidad este tipo de encapsulado en asp.net core, mas que nada porque las view las suelo desarrollar en Angular y del lado del servidor lo implemento como webapi

    Pero si analizo

    Crear una interfaz de usuario reutilizable mediante el proyecto de biblioteca de clases de Razor en ASP.NET Core

    en la primer parte indica que una Razor Class Library puede aplicarse con View Component

    >>parece que una RCL con RazorPages es más "portable" entre proyectos que es lo que necesito y hace más o menos lo mismo que un ViewComponent,

    pero une ambos, entiendo puedes poner un View Component en el RCL

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marked as answer by sanmolhec Monday, February 17, 2020 9:03 AM
    Thursday, February 13, 2020 2:14 PM
  • Hola Leandro, de nuevo gracias por la respuesta.

    Sobre lo que comentas de las RCL, parece que tienen bastante potencial y en algunos sitios lo que te recomiendan utilizar para hacer un nuget, aunque esto no sé cómo va del todo.

    Y sobre tu idea de juntar ambas cosas:

    pero une ambos, entiendo puedes poner un View Component en el RCL

    Pues debe ser de las pocas cosas que aún no he probado, pero puede tener mucho sentido así que lo voy a probar y ya os comento.

    Saludos, Héctor.

    Thursday, February 13, 2020 5:07 PM
  • Hola una vez más.

    Ya probé tu idea, Leandro, y efectivamente con un ViewComponent -VC- dentro de una Razor Class Library -RCL- (componente de vista en una Librería de clases Razor) la cosa funciona adecuadamente.

    Se puede crear un llamémoslo "componente web" reusable que puedes incluir en cualquier proyecto y cuyo código está centralizado. Puede ser casi todo lo complejo que se te ocurra, con js, css y otros estáticos (solo tener en cuenta cómo hay que referenciarlos en los proyectos /_content/{nombre librería}/js/...) un una parte de Back dentro del VC de la RCL y una parte View en la vista Default del VC de la RCL.

    Y otra cosa que hay que tener en cuenta es el orden de carga de las distintas partes de los proyectos (Controlador proyecto contenedor, vista contenedora, back del VC en la RCL, vista del VC, _Layout del proyecto contenedor) y cuando y donde se ha cargado jQuery para poderlo utilizar.

    Gracias por la ayuda y espero que pueda servir a más gente.

    Saludos, Héctor.

    • Marked as answer by sanmolhec Monday, February 17, 2020 9:03 AM
    Monday, February 17, 2020 9:03 AM