0

我开始使用带有 asp.net MVC 的 DurandalJs 框架。它工作完美。

但现在我需要使用 .cshtml 文件作为 durandal 的视图。所以我添加到root web.config

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

但是 DurandalJs 仍然尝试获取 .html 文件作为视图。

所以我更正了 viewEngine.js 文件:

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

但现在 DurandalJs 要求所有视图文件都应具有“.cshtml”扩展名。

那么我可以同时使用“.html”和“.cshtml”文件吗?

4

3 回答 3

2

在 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。

于 2013-04-03T13:19:59.380 回答
1

您需要更改路由以接受 cshtml 作为 MVC 路由的扩展。

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

此外,您需要确保您的应用程序池在集成而非经典模式下运行。

但我不建议这样做。您应该尝试不要让服务器呈现您的任何 HTML。原因在这里解释

于 2013-03-22T13:38:55.580 回答
0

看看 DurandalviewEngineviewLocator允许同时使用本地“.html”和远程“.cshtml”视图的自定义。

是否可以有多个 viewEngine.viewExtension

于 2013-03-22T17:25:46.120 回答