asp.net-mvc - usar - pasar variable de controlador a vista laravel
Cambiar el tipo de vista base en MVC4 (2)
He leído una publicación sobre cómo cambiar el tipo de vista base en MVC desde el siguiente enlace:
http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx
Seguí las instrucciones pero mi página aún hereda de System.Web.Mvc.WebViewPage
. No puedo acceder a ninguna propiedad definida en mi base de vistas personalizada y aparece un error en el tiempo de ejecución. Cuando uso la palabra clave @inherits
, corrige.
Web.config
<pages pageBaseType="[MyNamespace].WebViewPageBase">
<namespaces>
<add namespace="System.Web.Helpers" />
<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="System.Web.WebPages" />
</namespaces>
</pages>
WebViewPageBase
public class WebViewPageBase : WebViewPage
{
public SomeType MyProperty { get; set; }
public override void InitHelpers()
{
base.InitHelpers();
MyProperty = { foo };
}
public override void Execute()
{
}
}
public class WebViewPageBase<T> : WebViewPage<T>
{
public SomeType MyProperty { get; set; }
public override void InitHelpers()
{
base.InitHelpers();
MyProperty = { foo };
}
public override void Execute()
{
}
}
Vista parcial
@model TopMenuModel
<div class="topMenu">
@MyProperty
</div>
Pero en la publicación que he leído no hay instrucciones sobre la palabra clave @inherits
. ¿Hay algo que extraño o alguna forma de hacer que esto funcione sin @inherits
keyword en todas las páginas?
SOLUCIONADO
web.config
archivo web.config
en el directorio root
no es el correcto. Cambié el tipo base en el archivo web.config
en el directorio View
y lo arreglé.
¿Por qué mostró dos versiones de WebViewPageBase
: genéricas y no genéricas?
Solo necesitas la versión genérica:
public class MyWebView<T> : WebViewPage<T>
{
public SomeType MyProperty { get; set; }
public override void InitHelpers()
{
base.InitHelpers();
MyProperty = new SomeType();
}
public override void Execute()
{
}
}
y entonces:
<pages pageBaseType="MvcApplication1.WebViews.MyWebView">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
Ahora dentro de sus puntos de vista podrá usar la propiedad:
@model TopMenuModel
<div class="topMenu">
@MyProperty
</div>
ACTUALIZAR:
Configuración paso a paso:
- Cree una nueva aplicación ASP.NET MVC 3 utilizando la Plantilla de Internet
Agregar una vista base personalizada:
namespace MvcApplication1 { public class MyWebView<T> : WebViewPage<T> { public string MyProperty { get; set; } public override void InitHelpers() { base.InitHelpers(); MyProperty = "Hello World"; } public override void Execute() { } } }
Establezca el atributo
pageBaseType
en~/Views/web.config
(que no debe confundirse con~/web.config
):<pages pageBaseType="MvcApplication1.MyWebView"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> </namespaces> </pages>
Dentro
~/Views/Home/Index.cshtml
use la propiedad:<div> @MyProperty </div>
Presiona Ctrl + F5 para ejecutar la aplicación y si todo va bien recibirás un
Hello World
.
El problema que tienes es porque necesitas modificar el archivo web.config de la carpeta VIEWS. Así que básicamente esta línea:
<pages pageBaseType="[MyNamespace].WebViewPageBase">
debe estar en la web.config desde su carpeta de vistas, no desde la web.config del proyecto principal. La respuesta de Darin Dimitrov lo especifica claramente, pero la gente suele pasar por alto ese detalle. Lo sé porque yo era uno de ellos. En realidad, también lo hace el artículo de Phil Haack ...