2010-08-01 23 views
80

Me preguntaba qué, si es posible, es la mejor manera de hacer un parcial utilizando el nuevo motor de visión de afeitar. Entiendo que esto es algo que no había terminado por completo en el momento enRazor view engine - ¿Cómo puedo agregar vistas parciales?

En este momento estoy usando RenderPage para representar el control de usuario:

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model) 

La página de llamada RenderPage utiliza una página de diseño (maestro) con tres secciones definidas: TitleContent, HeadContent y Maincontent. Cuando intento renderizar mi control de configuración regional desde esta página, parece que estas secciones también son obligatorias; solo deben solicitarse en la página de llamada y están presentes. Recibo el siguiente mensaje, independientemente de si incluyo o no las secciones en mi vista parcial (obviamente no quiero incluir estas secciones, pero me pareció un punto de depuración interesante ...).

Las siguientes secciones se han definido pero no se han rendido en la página de diseño '~/Views/Shared/LocaleUserControl.cshtml': TitleContent; HeadContent; Maincontent

Mi vista parcial es la siguiente (adaptado de la siguiente link):

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel> 
@using System.Web.UI; 

<p> 
    @Html.LabelFor(model => Model.CountryName) 
    <br /> 
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"}) 
</p> 
<p> 
    @Html.LabelFor(model => Model.StateProvince) 
    <br /> 
    @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" }) 
</p> 


<script type="text/javascript"> 
    $(function() { 
     var countries = $("#CountryName"); 
     var statesprovinces = $("#StateProvince"); 
     countries.change(function() { 
      statesprovinces.find('option').remove(); 
      var url = '@Url.Action("GetStatesProvinces", "Base")'; 
      $.getJSON(url, { countryId: countries.val() }, function (data) { 
       $(data).each(function() { 
        $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces); 
       }); 
      }); 
     }); 
    }); 
</script> 

Respuesta

117

le miradas parciales al igual que un editor de plantillas por lo que podría incluirlo como tal (asumiendo por supuesto que su parcial se coloca en la subcarpeta ~/views/controllername/EditorTemplates):

@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel) 

O si este no es el caso, simplemente:

@Html.Partial("nameOfPartial", Model) 
+0

Gracias por los comentarios ... Html.EditorPuede ser una buena idea en este caso, pero me gustaría ver alternativas ya que este no es el caso para ejemplos más complejos. Definitivamente estaré ejecutando en esto de nuevo pronto Html.Partial no funcionará, ya que debe derivar de ViewPage o ViewUserControl mientras que el razor parcial deriva de WebViewPage ... –

+4

Html.Partial funciona perfectamente bien. Comience un nuevo proyecto ASP.NET MVC 3 en Visual Studio usando el motor Razor view, abra el archivo '_Layout.cshtml' en la carpeta 'Shared' y revise cómo la inclusión de' _LogOnPartial.cshtml' que se deriva de 'WebViewPage' es hecho (usando Html.Partial).Entonces, no, el parcial no necesita derivarse de 'ViewPage' o' ViewUserControl' para que '' Html.Partial' funcione. –

+1

Hmmm, parece que tienes razón. También parece que tengo algo de depuración que hacer. ¡Gracias! –

0

Si no desea duplicar código, y me gusta lo que desea es mostrar las estadísticas, en su modelo de vista, usted podría pasar en los modelos que desea obtener datos de este modo:

public class GameViewModel 
{ 
    public virtual Ship Ship { get; set; } 
    public virtual GamePlayer GamePlayer { get; set; }  
} 

Luego, en su controlador basta con ejecutar sus consultas en los respectivos modelos, pasarlas al modelo de vista y devolverlo, ejemplo:

GameViewModel PlayerStats = new GameViewModel(); 

GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault(); 

[código para comprobar si los resultados]

//pass current player into custom view model 
PlayerStats.GamePlayer = currentPlayer; 

Como dije, solo deberías hacer esto si quieres mostrar las estadísticas de las tablas relevantes, y no hay otra parte del proceso CRUD, por razones de seguridad que otras personas han mencionado anteriormente.

Cuestiones relacionadas