asp.net - para - download mvc 4 for visual studio 2017
DespuĆ©s de la actualizaciĆ³n de Windows "El tipo o nombre de espacio de nombres ''Html'' no existe en el espacio de nombres ''System.Web.Mvc''" (7)
- Puede ir a Referencias del proyecto actual.
-
Haga clic derecho en dll
System.Web.Mvc
y elija Propiedades - Se abrirá una ventana de Propiedades.
-
Cambiar
copia local
a
True
Hice una actualización de Windows y luego mi aplicación asp.net mvc 5 ya no se cargará quejándose de
CS0234: The type or namespace name ''Html'' does not exist in the namespace ''System.Web.Mvc''
indicando mis vistas web.config tiene la culpa
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.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.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="Ogre.Extensions" />
<add namespace="Newtonsoft.Json"/>
</namespaces>
</pages>
</system.web.webPages.razor>
Ahora esto es muy confuso.
En mi proyecto en sí, puedo ver el espacio de nombres
Html
, abriendo mi ensamblaje en ILSpy, puedo navegar al
System.Web.Mvc
enlazado y también puedo verlo, y el registro de fusión no muestra ningún error de enlace sospechoso.
Es como si solo mis vistas estuvieran vinculadas (con éxito) a una versión anterior de Mvc. ¿Por qué sucedería eso alguna vez? ¿Cómo puedo arreglarlo?
Permítanme aclarar que no ha habido configuración o incluso cambios de código. Todo esto está en mi máquina de desarrollo en IISExpress. Se estaba ejecutando, hice la actualización y reinicié y ahora ya no se está ejecutando.
Aquí están mis instalaciones recientes de la actualización. Podría comenzar a eliminarlos uno por uno, pero quiero saber qué está sucediendo realmente, ya que parece que me falta parte de la historia.
Además de configurar
CopyLocal=true
en la referencia del proyecto, es posible que también necesite cambiar el archivo
Web.Config de esta
manera ...
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>
Agregué
culture="neutral"
también, y todo esto resolvió el problema.
Además de configurar CopyLocal = true en la referencia del proyecto, es posible que también necesite cambiar el archivo Web.Config de esta manera ...
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>
Observe la nueva versión = "4.0.0.1". Esto funcionó para mí, y espero que también ayude a algunas personas.
Guarda la actualización del marco MVC en cualquier servidor de prueba / producción.
Saludos Microsoft. ¡Eres la mejor!
¡Tu intento de hacerme parecer incompetente frente a mis clientes ha sido frustrado una vez más!
Establecer CopyLocal = true no ayudó. Limpiar la solución, luego cerrarla y volver a abrirla funcionó nuevamente. Es posible que también deba cerrar toda la instancia de Visual Studio.
Esto parece haber sido causado por una actualización de Windows ( KB2990942 ) para reparar la vulnerabilidad de seguridad MS14-059 , lo que permite eludir las funciones de seguridad. Nuestras compilaciones dejaron de funcionar en nuestro servidor de compilación después de instalar Windows Update, y la actualización de los archivos csproj para usar 4.0.0.1 para la referencia System.Web.Mvc solucionó el problema.
La descripción de Microsoft de la vulnerabilidad es:
La vulnerabilidad podría permitir eludir la función de seguridad si un atacante convence a un usuario de hacer clic en un enlace especialmente diseñado o visitar una página web que contiene contenido especialmente diseñado para aprovechar la vulnerabilidad. En un escenario de ataque basado en la web, un atacante podría alojar un sitio web especialmente diseñado que está diseñado para aprovechar la vulnerabilidad a través de un navegador web y luego convencer a un usuario para que vea el sitio web. El atacante también podría aprovechar sitios web comprometidos y sitios web que aceptan o alojan contenido o anuncios proporcionados por el usuario. Estos sitios web podrían contener contenido especialmente diseñado que podría explotar la vulnerabilidad. Sin embargo, en todos los casos, un atacante no tendría forma de obligar a los usuarios a ver el contenido controlado por el atacante. En cambio, un atacante tendría que convencer a los usuarios para que tomaran medidas, generalmente haciendo que hagan clic en un enlace en un mensaje de correo electrónico o en un mensaje de Instant Messenger que los lleve al sitio web del atacante, o haciendo que abran un archivo adjunto enviado por correo electrónico .
Esto se rompió para cualquier usuario sin
CopyLocal=true
(o, en MSBuild speak,
<Private>True</Private>
) por
MS14-059
.
Las plantillas MVC establecen
<Private>True</Private>
de manera predeterminada, pero si usa NuGet para actualizar la versión MVC, pierde esa configuración (vea el
error NuGet # 4344
).
Hay dos aspectos del problema:
- Razor no incluye una referencia a MVC de manera predeterminada, por lo que su compilación no funcionará a menos que exista alguna versión de la DLL de MVC en su carpeta bin.
- Si implementa en una máquina separada que no tiene esta actualización instalada, la DLL MVC ya no se incluye en su salida, por lo que falta MVC.
Estás viendo el problema # 1. Para resolver ambos problemas, recomendaría realizar los dos cambios siguientes:
-
Agregue la siguiente configuración a Views / Web.config:
<system.web> <compilation> <assemblies> <add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> </system.web>
-
Establezca
CopyLocal=true
en la interfaz de usuario de VS para la referencia del proyecto, o agregue manualmente la siguiente línea a continuación en laReference
en su archivo .csproj:<Private>True</Private>
Por lo tanto, su referencia completa debería ser similar a la siguiente:
<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>../../packages/Microsoft.AspNet.Mvc.5.0.0/lib/net45/System.Web.Mvc.dll</HintPath>
</Reference>
Tenga en cuenta que NuGet eliminará la configuración CopyLocal / Private si actualiza los paquetes nuevamente en el futuro. (Por ejemplo, si actualiza a MVC 5.2 hoy). Si esa versión de MVC es alguna vez GAC, el problema n. ° 1 anterior no se repetirá mientras haya agregado la configuración en el paso A anterior, pero el problema n. ° 2 podría volver a ocurrir. Para garantizar que esto no suceda en el futuro, recomendaría configurar manualmente CopyLocal a verdadero cada vez que realice una actualización del paquete NuGet.
Santa mierda, gracias a @ Nevada-Williford por la pista.
Al entrar y configurar mi referencia
System.Web.Mvc
a
<Private>True</Private>
(Copy Local = True) lo arregló.
Tenga en cuenta que antes de la actualización todo funcionaba, después de la actualización tuve que modificar mi csproj para que volviera a funcionar.
Teoría de trabajo sobre lo que está sucediendo:
Copy Local = True
y
<Private>True</Private>
solía ser casi,
pero no exactamente, la misma cosa.
La primera era una configuración de Visual Studio, la segunda una configuración de msbuild.
Si la configuración de msbuild estuviera ausente, se aplicaría la configuración de Visual Studio (siempre que estuviera en VS).
En esta actualización, creo que lo cambiaron, por lo que
Copy Local
solo refleja el atributo de presencia.
En nuestro proyecto no tenemos ese atributo establecido explícitamente, pero
Copy Local = True
antes de la actualización
System.Web.Mvc.dll
se copia en el directorio bin.
Después de la actualización, dado que falta el atributo,
Copy Local
muestra
False
y debe establecerlo en
True
para asegurarse de obtener una copia local.
La configuración manual de
Copy Local = True
(o agregar ese elemento xml a msbuild) soluciona el problema.
Editar: Si bien esta parece ser la respuesta a la pregunta específica, cualquiera que venga aquí debería leer el hilo de comentarios y otras respuestas, especialmente de dmatson, para obtener más contexto, advertencias y errores relacionados.