2011-04-30 9 views
6

Tengo las últimas versiones de VS 2010, .NET 4.0 y MVC 3 y tengo un problema al usar áreas en asp.net mvc 3 cuando uso vb. red.No se puede cargar la vista en el área en asp.net mvc 3 usando vb.net

hago lo siguiente:

  1. Crear un nuevo proyecto visual asp.net mvc básica 3. Seleccione Razor como "Ver Engin" y llame al proyecto "TestApp".
  2. Crea una nueva área llamada "Prueba", estará en la carpeta:/Áreas/Prueba.
  3. Añadir un nuevo controlador de vacío llamado "PageController.vb" en/Áreas/test/Controladores /".
  4. Añadir una nueva carpeta en/áreas/Prueba/Vistas/llamada "página".
  5. Añadir un nuevo Ver vacío llamado "Index.vbhtml" en/áreas/Prueba/Vistas/Página
  6. Ejecutar el proyecto
  7. escriba manualmente la URL "http: // localhost: xyz/Prueba/Página".. en el navegador, donde xyz es el número de puerto agregado automáticamente generado por VS.

En el paso 7 aparece el mensaje "El recurso ca no se encuentra ".

Si hago exactamente lo mismo usando C#, entonces llegaré a la página correcta y se mostrará la palabra "Index" como se esperaba.

¿Esto es un error o me falta algo? He estado escaneando la web durante horas tratando de resolver esto, pero me estoy volviendo obvio.

Este es el archivo creado de forma automática TestAreaRegistration.vb Espacio de nombres TestApp.Areas.Test Clase pública TestAreaRegistration Hereda AreaRegistration

Public Overrides ReadOnly Property AreaName() As String 
     Get 
      Return "Test" 
     End Get 
    End Property 

    Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext) 
     context.MapRoute(_ 
      "Test_default", _ 
      "Test/{controller}/{action}/{id}", _ 
      New With {.action = "Index", .id = UrlParameter.Optional} _ 
     ) 
    End Sub 
End Class 

Fin Espacio de nombres

y este es el archivo creado de forma automática Global.ascx : 'Nota: para obtener instrucciones sobre cómo habilitar el modo clásico IIS6 o IIS7, ' visite http://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication Hereda System.Web.HttpApplication

Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection) 
    filters.Add(New HandleErrorAttribute()) 
End Sub 

Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

    ' MapRoute takes the following parameters, in order: 
    ' (1) Route name 
    ' (2) URL with parameters 
    ' (3) Parameter defaults 
    routes.MapRoute(_ 
     "Default", _ 
     "{controller}/{action}/{id}", _ 
     New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ 
    ) 

End Sub 

Sub Application_Start() 
    AreaRegistration.RegisterAllAreas() 

    RegisterGlobalFilters(GlobalFilters.Filters) 
    RegisterRoutes(RouteTable.Routes) 
End Sub 

End Class

Estos son idénticos a lo que se obtiene si se repete los pasos 1-7 y utilizar C# (única diferencia es que se quiere obtener el código C# que es igual al código anterior de vb.net).

Repito: si hago los pasos del 1 al 7 en C#, funciona, pero no funcionará en vb.net. ¿Qué está mal?

Respuesta

7

El problema es que sus controladores no están en el espacio de nombres predeterminado del controlador. Tendrá que hacer una referencia manual de los espacios de nombres del controlador. Hay una sobrecarga para esto. Pruebe esto:

Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext) 
     context.MapRoute(_ 
      "Test_default", _ 
      "Test/{controller}/{action}/{id}", _ 
      New With {.action = "Index", .id = UrlParameter.Optional}, _ 
      New With {"MyDefaultNamespace/Areas/Test/Controllers"} _ 
     ) 
End Sub 

El archivo de configuración de área predeterminado en realidad no hace referencia al espacio de nombres del controlador del área. Este es un desafortunado descuido.Por lo tanto, a menos que copie sus controladores anteriores en las carpetas nuevas (y retenga el espacio de nombres anterior), obtendrá un error al primer intento. hacer referencia a los espacios de nombres correctos solucionará este problema.

edición:

Además, no se ha mencionado nada acerca de cómo crear una acción para su página ... se trata de un error tipográfico, o que el controlador viene con uno por defecto?

+1

Utilicé el método de acción predeterminado que se obtiene al crear un controlador vacío, por lo que no fue eso. ¡Gracias por ponerme en el camino correcto! Puse los dos proyectos de muestra uno al lado del otro para ver si había alguna diferencia entre el proyecto C# y vb.net y ahora vi que había algunas diferencias de "Espacio de nombres" en, por ejemplo, el "PageController.vb" en comparación con "PageController .cs ". Parece que la versión vb.net de mvc 3 olvidó agregar las definiciones correctas del espacio de nombre y cuando lo corrigí todo comenzó a funcionar. – Thomas

+0

yay !! horas de desconcierto, y todo lo que tenía que hacer era arreglar los espacios de nombres en cada controlador autogenerado. ¡¡Gracias!! – user158017

+1

Esta respuesta me puso en el camino correcto, pero, me parece que la sintaxis del 4to parámetro está un poco desajustada ... debería ser más como esto: namespaces: = {"MyDefaultNamespace.Areas.Test.Controllers"} o al menos esto es lo que funcionó para mí Aunque mis controladores de área no estaban en este espacio de nombres, los examiné específicamente como tales y agregué este parámetro y todo funcionó en mi aplicación web VB.NET MVC 4. – bkwdesign

Cuestiones relacionadas