vista ventajas tutorial net mvc modelo form estructura ejemplos ejemplo controlador asp asp.net-mvc asp.net-mvc-3 razor

asp.net-mvc - ventajas - mvc ejemplos



La vista basada en navaja no muestra ensambles referenciados (18)

Además de realizar cambios en .config para <assemblies> y <namespaces> , descubrí que hacer GAC en el ensamblaje hizo una gran diferencia. Puede aplicar token de cultura y clave pública como cualquier ensamblado .NET principal que esté registrado globalmente.

Algunos pueden estremecerse ante la mención del GAC. Pero como desarrollador de BizTalk, he llegado a abrazarlo.

Estoy intentando crear una vista fuertemente tipada basada en una clase de otro ensamblaje. Sin embargo, por cualquier motivo, mi vista Razor no parece tener visibilidad de otros ensambles a los que se hace referencia en mi proyecto. p.ej

@model MyClasses.MyModel

da como resultado el error en Visual Studio 2010, " MyClasses pudo encontrar el tipo o el nombre del espacio de nombres MyClasses (¿falta una directiva using o una referencia de ensamblado?)".

La misma clase a la que se hace referencia en el motor de vista estándar funciona bien. Tengo el mismo problema tratando de hacer referencia a la clase en el cuerpo de mi vista.

¿Me estoy perdiendo algo sobre Razor o necesito hacer referencia al ensamblaje de otra manera?


El nombre de tu proyecto FOLDER debe ser el mismo. Si su nombre de proyecto o solución es diferente, entonces MVC lo lastimará.

Ejemplo: si crea una nueva aplicación y obtiene el nombre predeterminado Webapplicaiton1, se creará este espacio de nombres. Por lo tanto, digamos que no desea tener este espacio de nombres, por lo que desde el VS cambia a donde quiera que vea "MyNamespace". También busca y reemplaza todo el código de "Webapplication1" y lo reemplaza con "MyNamespace". Esto también cambia el archivo web.config, de modo que inculde

Ahora todo funcionará, excepto las vistas de Razor.

RazorViews no puede encontrarlo, porque hay algún tipo de dependencia extraña en el FOLDERNAME del proyecto. Es un diseño terrible.

He probado esto semi-completamente al copiar mis archivos en una nueva solución, y la única diferencia es el nombre de la carpeta.


En ASP.NET Core MVC, la solución es agregar un using en _ViewImports.cshtml, en lugar de ponerlo web.config en la carpeta Ver cuando se trabaja con ASP.NET MVC 5.

_ViewImports.cshtml

@using mySolution @using mySolution.ViewModels // <-- Add this, and place your ViewModel (e.g. LoginViewModel) in here. @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Ver

@model LoginViewModel // Add to _ViewImports to make this line work <div>This is the View for the login screen.</div>


En mi caso, el proyecto separado que contenía el espacio de nombres era una aplicación de consola. Cambiarlo a una Biblioteca de clases solucionó el problema.


Esta solución funcionó para mí (es gracioso, pero funciona)

Edité las páginas de vista y copié el contenido y pegué en él, no cambié el contenido de las vistas, sino que solo edité para que el estudio visual pudiera hacer el seguimiento de las páginas, y luego todo comenzó a funcionar.

Solución: solo edite las páginas y reemplácelas por las mismas (Trabajó para mí)


Hay una nueva sección de configuración que se utiliza para referenciar espacios de nombres para vistas Razor.

Abra el archivo web.config en su carpeta de Views y asegúrese de que tenga lo siguiente:

<configuration> <configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="SquishIt.Framework" /> <add namespace="Your.Namespace.Etc" /> </namespaces> </pages> </system.web.webPages.razor> </configuration>

Alternativamente, puede agregar instrucciones de uso a su diseño compartido:

@using Your.Namespace.Etc; <!DOCTYPE html> <head> ....

Después de editar Web.config, reinicie Visual Studio para aplicar los cambios.


Intente agregar el espacio de nombre en el que se MyClasses sus MyClasses al archivo web.config en

<pages> <namespaces></namespaces> </pages>


Ninguno de estos https://.com/a/7597360/808128 me funciona. Incluso "agregar ensamble refereciane a la sección system.web / compilation / assambleas del archivo raíz web.config". Así que las dos formas me quedan: 1) agregar una clase de envoltura pública para mi ensamble que permita que el código Razor pueda acceder a este ensamblado a través de este ajuste; 2) simplemente agregue lógica de ensamblaje a una clase pública en el mismo ensamblaje donde se encuentra el código Razor.


Ninguno de los anteriores funcionó para mí tampoco;

  • Los Dlls se configuraron para copiar Local
  • Agregar espacios de nombres a ambos web.configs no hizo nada
  • Agregar las referencias de ensamblado a system.web / compilation / assemblies tampoco ayudó (aunque no eliminé estas referencias, por lo que es posible que también se necesiten)

Pero finalmente encontré algo que funcionó para mí:

Fue porque tenía mi Build Output en bin / Debug / para la configuración de Debug y bin / Release / para las configualaciones de Release. Tan pronto como cambié la Configuación de compilación a "bin /" para todas las configuaciones (como se muestra en la imagen a continuación), ¡entonces todo comenzó a funcionar como debería!

No tengo idea de por qué separar las compilaciones en las carpetas Liberar y Depurar debería hacer que la sintaxis Razor se rompa, pero parece ser porque algo no pudo encontrar los ensamblajes. Para mí, los proyectos que tenían problemas con la sintaxis de la navaja de afeitar son en realidad mis proyectos de la ''biblioteca de afeitar''. Están configurados como proyectos de aplicación; sin embargo, los utilizo como bibliotecas de clases con RazorGenerator para compilar mis vistas. Cuando intenté ejecutar uno de estos proyectos directamente, causó el siguiente error de configuración:

No se pudo cargar el archivo o ensamblado ''System.Web.Helpers, Versión = 3.0.0.0, Cultura = neutral, PublicKeyToken = 31bf3856ad364e35'' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.

Esto me llevó a intentar cambiar el Build Output, ya que noté que para todos los proyectos web el Build Output parece estar siempre directamente en la carpeta bin, a diferencia del predeterminado para las bibliotecas de clases, que tienen carpetas de versiones y de depuración.


Obtuve el mismo error al intentar usar objetos Smo en una vista Razor. Aparentemente esto se debe a que Razor no puede encontrar los archivos DLL a los que se hace referencia en el proyecto. Resolví esto configurando "Copiar local" en true para todos los dlls de Smo, sin embargo podría haber una solución mejor (ver el enlace de Czechdude arriba). Las ediciones @using y web.config son inútiles porque solo son necesarias si deseas omitir el espacio de nombres parte de los nombres de tipo (por ejemplo, Servidor en lugar de Microsoft.SqlServer.Management.Smo.Server)


Obtuve un error similar después de mover mi máquina de desarrollo de Win7 32 bits a Win7 de 64 bits. Mensaje de error:

.../Web/Views/Login.cshtml: ASP.net runtime error: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from System.Web.WebPages.Razor, Version=1.0.0.0 ... Type B originates from ... Version=2.0.0.0

Resulta que tenía ambas versiones en el GAC. The View web.config referencia a v1 pero la aplicación hacía referencia a v2. Se eliminaron los ensamblados a los que se hace referencia y se volvió a agregar v1. de System.Web.WebPages.Razor , etc.


Para mí, estaba haciendo referencia a un proyecto que era una aplicación de consola. Se configuró para compilar como un exe (aplicación de consola) en lugar de una biblioteca de clases (DLL). Cuando cambié esto, pude ver los modelos de ese proyecto separado sin ningún problema.


Parece que estás buscando esta respuesta: https://.com/a/4136773/176877

Es decir, abra las Vistas internas / Web.Config (NO la raíz) y agregue el espacio de nombres debajo de la etiqueta Páginas:

<system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory.../> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> ... <add namespace="System.Web.Routing" /> <!-- Your namespace here --> </namespaces>

Guarde eso, luego cierre y vuelva a abrir el archivo Razor.

Si está utilizando Áreas necesitará hacer esto para cada Web.Config en cada Área.

Visual Studio se ha vuelto más problemático a lo largo de los años, por lo que puede ser necesario cerrar el archivo Razor ejecutando una compilación de depuración y luego volver a abrir el archivo Razor o, en el peor de los casos, requerir reiniciar Visual Studio. Pero en última instancia, le presentará el archivo Razor como si todo en la lista de espacios de nombres estuviera en @usando declaraciones en la parte superior de todas sus Vistas.


También tuve el mismo problema, pero el problema fue con el marco de Target de la asamblea .

El ensamblado al que se hace referencia estaba en .NET Framework 4.6 donde el proyecto se ha configurado en .NET framework 4.5.

Espero que esto ayude a alguien que estropeó los marcos.


Tuve el mismo problema: MVC3 Project MyCore.Web estaba haciendo referencia al espacio de nombres MyCore.DBLayer de otro proyecto en la misma solución (con el nombre de conjunto MyCoreDBLayer). Todos los objetos de MyCore.DBLayer funcionaron perfectamente en Controladores y Modelos pero fallaron en las vistas de Razor con un error ''El tipo o nombre del espacio de nombres'' DBLayer ''no existe en el espacio de nombres'' MyCore ''(¿falta una referencia de ensamblado?)'' Que era obviamente no es el caso.

  • La opción Copiar local se estableció en verdadero.
  • Agregar declaraciones de "usar ..." en vistas de Razor era inútil
  • Agregar espacios de nombres a la sección system.web.webPages.razor era inútil también

Al agregar una referencia de ensamblado a la sección system.web / compilation / assambleas del archivo raíz web.config, se solucionó el problema. La sección ahora se ve así:

<system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> **<add assembly="MyCoreDBLayer" />** </assemblies> </compilation> ... </system.web>

Omitir versión, cultura, token estuvo bien por ahora, pero debería solucionarse en el futuro.


bueno, para mí fue diferente. Me faltaba el ensamblaje de mi proyecto de aplicación de consola con el proyecto MVC. Entonces, agregar referencia no fue suficiente.

bueno, esto podría ayudar a alguien más. vaya a la raíz del sistema de archivos web.config.web -> compilation -> agregue la referencia de su proyecto de esta manera.

<assemblies> <add assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </assemblies>


en modelos spacename, yourClassModel, agrega public before antes de la clase de nombre

clase pública yourClassModel {prop}


incluir todo el espacio de nombres

@model namespace.myclasses.mymodel