2012-03-14 2 views
7

Я использую mustache.js на клиенте и Nustache в проекте ASP.NET MVC3.Совместное использование шаблонов усов/nustache между сервером и клиентом. ASP.NET MVC

У меня есть Person.mustache шаблон в папке Посмотреть на сервере, который я использую, как это:

@Html.Partial("Person") 

от Razor главного вида (Index.cshtml).

Но как передать его клиенту? Браузер не имеет доступа к папке Views, чтобы получить исходное содержимое шаблона. Каким-то образом у меня должен быть способ включить вывод HTML-исходного текста шаблона Person.mustache на сервере. Если я требую его из представления Razor, он скомпилирует его, так как это обычный механизм шаблонов сервера.

Пожалуйста, любой может дать какие-либо идеи? Благодарю.

ответ

3

Ну, я «Сделал что-то, что работает, может быть, кто-то придумает лучшее решение. Вот оно:

Extenstion для помощника @Html:

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); 

    } 
} 

И в Razor главном экране для индекса страницы

@using MyProject.Helpers; 

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

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

</script> 
1

Возможно, вам захочется открыть новый контроллер, который может вернуть ваш частичный контент. Например:

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

При том, что и маршрут:

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

можно затем вызвать у клиента (в данном примере я использую JQuery):

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

Невозможно заставить это работать. В каком пространстве имен находится «Partial»? Я нашел только «PartialView», но компилирует шаблон с заданной моделью – Roman

+0

Спасибо за редактирование. Но PartialView «Создает объект PartialViewResult, который отображает частичный вид» - от http://msdn.microsoft.com/en-en/library/system.web.mvc.controller.partialview.aspx, когда мне нужно сырое содержимое шаблона со всем, что {{}} символы – Roman

0

Имя файла Person.mustache.cshtml, и в Index.cshtml:

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

Нет необходимости писать помощник, чтобы обслуживать файл, когда фреймворк делает это для ты.

+0

С таким подходом я бы не смог использовать Person.mustache в качестве шаблона сервера, если бы переименовал его так – Roman

Смежные вопросы