2012-03-14 21 views
7

Estoy usando bigote.js en el cliente y Nustache en el proyecto ASP.NET MVC3.Compartir plantillas de bigote/bigote entre el servidor y el cliente. ASP.NET MVC

que tienen Person.mustache plantilla en una carpeta Ver en el servidor, que utilizo como esto:

@Html.Partial("Person") 

de la vista principal de la maquinilla de afeitar (Index.cshtml).

¿Pero cómo puedo transferirlo al cliente? El navegador no tiene acceso a la carpeta Vistas para obtener el contenido sin formato de una plantilla. De alguna manera, debo tener una forma de incluir el texto HTML en bruto de la plantilla Person.mustache en el servidor. Si lo solicito desde Razor view, lo compila, ya que es un motor de plantilla de servidor normal.

¿Alguien puede dar alguna idea? Gracias.

Respuesta

3

Bueno, He hecho algo, eso funciona, tal vez alguien encuentre una mejor solución. Aquí está:

Extenstion para @Html ayudante:

public static class ViewExtensions 
{ 
    public static IHtmlString RenderRawContent(this HtmlHelper helper, string serverPath) 
    { 
     string filePath = HttpContext.Current.Server.MapPath(serverPath); 

     //load from file 
     StreamReader streamReader = File.OpenText(filePath); 
     string markup = streamReader.ReadToEnd(); 
     streamReader.Close(); 

     return new HtmlString(markup); 

    } 
} 

Y en vista principal de la maquinilla de afeitar de la página Índice

@using MyProject.Helpers; 

<script type="text/template" id="person_template"> 

    @Html.RenderRawContent("~/Templates/Person.mustache") 

</script> 
1

Es probable que desee exponer un nuevo controlador que pueda devolver el contenido de su vista parcial. Por ejemplo:

public class TemplateController : Controller 
{ 
    public PartialViewResult Get(string name) 
    { 
    return PartialView(name); 
    } 
} 

Con eso, y una ruta:

routes.MapRoute("Templates", "templates/{name}", 
    new { controller = "Template", action = "Get" }); 

Entonces puede llamar desde el cliente (en este ejemplo estoy usando jQuery):

var model = { name: "Matt" }; 
$.ajax({ 
    url: "/templates/person", 
    success: function(r) { 
    var html = Mustache.render(r, model); 
    $("body").append(html); 
    } 
}); 
+0

No podría hacer que esto funcione. ¿En qué espacio de nombres está la clase "Parcial"? Solo encontré "PartialView", pero compila la plantilla con el modelo dado – Roman

+0

Gracias por editar. Pero PartialView "crea un objeto PartialViewResult que representa una vista parcial" - desde http://msdn.microsoft.com/en-en/library/system.web.mvc.controller.partialview.aspx, cuando necesito contenido sin procesar de la plantilla con todos los {{}} símbolos – Roman

0

Nombre del archivo Person.mustache.cshtml, y en Index.cshtml:

<script type="text/template" id="person_template"> 
    @Html.Partial("Person.mustache") 
<script type="text/template" id="person_template"> 

No es necesario escribir un ayudante para servir un archivo cuando el marco hace eso eres tú

+0

Con ese enfoque no podría usar Person.mustache como plantilla de servidor, si le cambio el nombre así – Roman

Cuestiones relacionadas