una - ASP.NET MVC, vistas fuertemente tipificadas, parámetros parciales de la vista.
razor para mvc (4)
Aunque esto ha sido respondido, encontré esto y decidí que quería resolver este problema para mi proyecto en lugar de solucionarlo con ''new ViewDataDictionary ()''.
Creé un conjunto de métodos de extensión: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
También agregué algunos métodos que no llaman parcial si el modelo es nulo, esto ahorrará muchas declaraciones if.
Los creé para Razor, pero un par de ellos también deberían funcionar con vistas de estilo aspx (las que usan HelperResult probablemente no sean compatibles).
Los métodos de extensión se ven así:
@* calls the partial with Model = null *@
@Html.PartialOrNull("PartialName", null)
@* does not call the partial if the model is null *@
@Html.PartialOrDiscard("PartialName", null)
También hay métodos para los modelos de IEnumerable y los de descarte también pueden llamarse con un lambda Razor que le permite envolver el resultado parcial con algunos html.
Siéntete libre de usarlos si quieres.
Si tengo una vista que hereda de:
System.Web.Mvc.ViewPage<Foo>
Donde Foo tiene una propiedad Barra con una cadena de tipo
Y la vista quiere generar una vista parcial fuertemente tipada que hereda de:
System.Web.Mvc.ViewUserControl<string>
Me gusta esto:
Html.RenderPartial("_Bar", Model.Bar);%>
Entonces por qué tirará esto:
El elemento del modelo que se pasa al diccionario es de tipo ''Foo''
pero este diccionario requiere un elemento modelo de tipo ''System.String''.
cuando la barra no se inicializa?
Más específico: ¿por qué pasa Foo, donde debería pasar nulo?
Como @Dennis señala, si el valor del modelo es nulo, utilizará el modelo existente desde la vista. La razón de esto es para admitir la capacidad de llamar a una vista parcial utilizando una firma que contiene solo el nombre de la vista parcial y hacer que reutilice el modelo existente. Internamente, todos los ayudantes de RenderPartial se remiten a un solo método RenderPartialInternal. La forma en que obtiene ese método para reutilizar el modelo existente es pasar un valor nulo para el modelo (que la firma que toma solo el nombre de una vista). Cuando pasa un valor nulo a la firma que contiene tanto un nombre de vista como un objeto modelo, esencialmente está replicando el comportamiento del método que toma solo el nombre de la vista.
Esto debería solucionar su problema:
<% Html.RenderPartial( "_Bar", Model.Bar ?? string.Empty ) %>
Mire la fuente MVC de ASP.NET (HtmlHelper.cs -> RenderPartialInternal method -> line 258):
...
if (model == null) {
if (viewData == null) {
newViewData = new ViewDataDictionary(ViewData);
}
...
Este es exactamente tu caso. ASP.NET MVC usa el ViewData de su ViewContext
ACTUALIZADO:
Intenta esto en su lugar:
<% Html.RenderPartial("_Bar", Model.Bar ?? "Default" ); %>
Si pasa nulo como modelo a RenderPartial, entonces verá el modelo original, por lo que el error dice foo.
Deberá asegurarse de que la barra esté inicializada para ser una cadena vacía en lugar de nula.
Editar: @Arnis, mira el código fuente. No miente. Pasas nulo a la sobrecarga de RenderPartial. No estás pasando a Foo . Internamente, el sistema usa el Modelo del ViewContext de su página (que es Foo ) cuando pasa una Barra nula a RenderPartial.