Lo que veo es una propiedad de diseño de cadena. Pero, ¿cómo puedo pasar un modelo al diseño de forma explícita?
c#
.net
asp.net-mvc
razor
Chico siberiano
fuente
fuente
Model
está disponible en_Layout
. Estoy usando MVC5.Respuestas:
Parece que ha modelado sus modelos de vista un poco mal si tiene este problema.
Personalmente, nunca escribiría una página de diseño. Pero si desea hacer eso, debe tener un modelo de vista base que hereden sus otros modelos de vista y escribir su diseño en el modelo de vista base y sus páginas en el modelo de vista específico una vez.
fuente
Ejemplo: controlador:
Ejemplo de parte superior de la página de diseño
Ahora puede hacer referencia a la variable 'viewModel' en su página de diseño con acceso completo al objeto escrito.
Me gusta este enfoque porque es el controlador el que controla el diseño, mientras que los modelos de vista de página individuales siguen siendo independientes del diseño.
Notas para MVC Core
Mvc Core parece volar el contenido de ViewData / ViewBag al llamar a cada acción la primera vez. Lo que esto significa es que la asignación de ViewData en el constructor no funciona. Sin embargo, lo que sí funciona es usar
IActionFilter
y hacer exactamente el mismo trabajo enOnActionExecuting
. PonteMyActionFilter
tuMyController
.fuente
esto es algo bastante básico, todo lo que necesita hacer es crear un modelo de vista base y asegurarse de que TODO! y me refiero a TODOS! de sus vistas que alguna vez usarán ese diseño, recibirán vistas que usen ese modelo base.
en _Layout.cshtml:
en el método Index (por ejemplo) en el controlador doméstico:
el Index.cshtml:
No estoy de acuerdo con que pasar un modelo al _layout sea un error, se puede pasar alguna información del usuario y los datos se pueden completar en la cadena de herencia de los controladores, por lo que solo se necesita una implementación.
obviamente, para un propósito más avanzado, debería considerar crear un contacto estático personalizado mediante inyección e incluir ese espacio de nombres de modelo en _Layout.cshtml.
pero para usuarios básicos esto servirá
fuente
Una solución común es crear un modelo de vista base que contenga las propiedades utilizadas en el archivo de diseño y luego heredar del modelo base a los modelos utilizados en las páginas respectivas.
El problema con este enfoque es que ahora se ha encerrado en el problema de que un modelo solo puede heredar de otra clase, y tal vez su solución sea tal que no pueda usar la herencia en el modelo que pretendía de todos modos.
Mi solución también comienza con un modelo de vista base:
Lo que luego uso es una versión genérica de LayoutModel que hereda de LayoutModel, así:
Con esta solución he desconectado la necesidad de tener herencia entre el modelo de diseño y el modelo.
Entonces ahora puedo seguir adelante y usar LayoutModel en Layout.cshtml de esta manera:
Y en una página puede usar el LayoutModel genérico como este:
Desde su controlador, simplemente devuelve un modelo de tipo LayoutModel:
fuente
¿Por qué no agrega una nueva vista parcial con el controlador específico de i pasando el modelo requerido a la vista parcial y finalmente renderiza la vista parcial mencionada en su Layout.cshtml usando RenderPartial o RenderAction?
Utilizo este método para mostrar la información del usuario que ha iniciado sesión, como el nombre, la imagen de perfil, etc.
fuente
Pregunta anterior, pero solo para mencionar la solución para los desarrolladores de MVC5, puede usar la
Model
propiedad igual que en la vista.La
Model
propiedad tanto en la vista como en el diseño está asociada con el mismoViewDataDictionary
objeto, por lo que no tiene que hacer ningún trabajo adicional para pasar su modelo a la página de diseño, y no tiene que declarar@model MyModelName
en el diseño.Pero tenga
@Model.XXX
en cuenta que cuando use en el diseño, el menú contextual de intelliSense no aparecerá porqueModel
aquí hay un objeto dinámico comoViewBag
.fuente
Tal vez técnicamente no sea la forma correcta de manejarlo, pero la solución más simple y razonable para mí es simplemente crear una clase e instanciarla en el diseño. Es una excepción única a la forma correcta de hacerlo. Si esto se hace más que en el diseño, entonces debe reconsiderar seriamente lo que está haciendo y tal vez leer algunos tutoriales más antes de avanzar más en su proyecto.
entonces en la vista
en .net core, incluso puede omitir eso y usar la inyección de dependencia.
Es una de esas áreas que tiene cierta sombra. Pero dadas las alternativas extremadamente complicadas que estoy viendo aquí, creo que es más que una buena excepción para hacer en nombre de la practicidad. Especialmente si se asegura de mantenerlo simple y se asegura de que cualquier lógica pesada (yo diría que realmente no debería haber ninguna, pero los requisitos difieren) está en otra clase / capa a la que pertenece. Ciertamente es mejor que contaminar TODOS sus controladores o modelos por el simple hecho de tener una sola vista.
fuente
Hay otra forma de archivarlo.
Simplemente implemente la clase BaseController para todos los controladores .
En la
BaseController
clase, cree un método que devuelva una clase Modelo como, por ejemplo.Layout
página puedes llamar a ese métodoGetTopMenu()
fuente
Supongamos que su modelo es una colección de objetos (o tal vez un solo objeto). Para cada objeto del modelo, haga lo siguiente.
1) Coloque el objeto que desea mostrar en ViewBag. Por ejemplo:
2) Agregue una declaración using en la parte superior de _Layout.cshtml que contiene la definición de clase para sus objetos. Por ejemplo:
@using YourApplication.YourClasses;
3) Cuando haga referencia a yourObject en _Layout, cámbielo. Puede aplicar el yeso por lo que hizo en (2).
fuente
Utilice IContainsMyModel en su diseño.
Resuelto. Regla de interfaces.
fuente
Por ejemplo
Leer más sobre la nueva directiva @model
fuente