Как я могу использовать файлы .cshtml и .html с Durandal

Я начал использовать фреймворк DurandalJs с asp.net MVC. Он работает идеально.

Но теперь мне нужно использовать файлы .cshtml в качестве представлений для Durandal. Поэтому я добавил в корень web.config

<add key="webpages:Enabled" value="true" /> 

Но DurandalJs все еще пытаются получить файлы .html как представления.

Итак, я исправляю файл viewEngine.js:

    return {
    viewExtension: '.cshtml',
    viewPlugin: 'text',

но теперь DurandalJs требует, чтобы все файлы представлений имели расширение ".cshtml".

Итак, могу ли я использовать файлы «.html» и «.cshtml» вместе?


person pryabov    schedule 22.03.2013    source источник


Ответы (3)


В main.js я добавил строку:

viewLocator.useConvention('viewmodels', 'ViewsProxy/GetView?name=', 'ViewsProxy/GetView?name=');

И реализовал ViewsProxyController, как показано ниже:

public class ViewsProxyController : Controller
{
    public ActionResult GetView(string name)
    {
        string viewRelativePath = GetRelativePath(name);
        string viewAbsolutePath = HttpContext.Server.MapPath(viewRelativePath);

        if (!System.IO.File.Exists(viewAbsolutePath))
        {
            viewAbsolutePath = ReplaceHtmlWithCshtml(viewAbsolutePath);
            if (System.IO.File.Exists(viewAbsolutePath))
            {
                System.Web.HttpContext.Current.Cache.SetIsHtmlView(name, false);
                viewRelativePath = ReplaceHtmlWithCshtml(viewRelativePath);
                return PartialView(viewRelativePath);
            }
            throw new FileNotFoundException();
        }

        FilePathResult filePathResult = new FilePathResult(viewAbsolutePath, "text/html");
        return filePathResult;
    }

    private string ReplaceHtmlWithCshtml(string path)
    {
        string result = Regex.Replace(path, @"\.html$", ".cshtml");
        return result;
    }

    private string GetRelativePath(string name)
    {
        string result = string.Format("{0}{1}", AppConfigManager.DurandalViewsFolder, name);
        return result;
    }
}

Итак, теперь приложение Durandal может работать с .html и .cshtml.

person pryabov    schedule 03.04.2013

Вам нужно изменить свои маршруты, чтобы принять cshtml в качестве расширений для маршрутов MVC.

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}.cshtml",
    defaults: new { controller = "Home", action = "Index", namespaces: new string[] { "PAWS.Web.Controllers" }
);

Также вам необходимо убедиться, что ваш пул приложений работает в интегрированном, а не в классическом режиме.

Но я не рекомендую этого делать. Вы должны попытаться сделать так, чтобы сервер не отображал ваш HTML. Причина этого объясняется здесь

person Evan Larsen    schedule 22.03.2013

Взгляните на настройки Durandal viewEngine и viewLocator, которые позволяют одновременно использовать как локальные '.html', так и удаленные '.cshtml' представления.

Возможно ли иметь несколько viewEngine.viewExtension

person irium    schedule 22.03.2013