如何将 Visual Studio 2010 MVC 3 用于非基于 html 的项目?
-
10-12-2019 - |
题
我想将 Visual Studio 2010 MVC 3 框架用于托管的 Web 项目 虚拟XML 和 CCXML 而不是用于基于电话的应用程序的 HTML。
MVC 3 似乎非常适合这种类型的应用程序,我认为它是更广泛使用的基于 jsp/Tomcat 的应用程序(通常用于 VXML/CCXML)的一个很好的替代方案。但有一些烦恼:
- 该项目尝试将我的 .cshtml 页面验证为 HTML(可以理解),或者我在“选项”>“文本编辑器”>“HTML”>“验证”>“目标”中设置的任何目标验证,但它强制我进行验证。我似乎找不到完全关闭它的方法。有没有办法将其关闭并防止数百个警告?或者更好的是,为 CCXML/VXML 编写我自己的自定义验证?
- 有没有办法自动将所有视图的内容类型设置为“text/vxml”,而无需编写
Response.ContentType = "text/vxml";
在每个行动方法中?
解决方案
您可以基于 Razor 视图引擎编写自定义视图引擎,并为您的视图注册自定义扩展:
public class VXMLViewEngine : RazorViewEngine
{
public VXMLViewEngine()
{
ViewLocationFormats = new[] { "~/Views/{1}/{0}.vxml", "~/Views/Shared/{0}.vxml" };
MasterLocationFormats = new[] { "~/Views/{1}/{0}.vxml", "~/Views/Shared/{0}.vxml" };
PartialViewLocationFormats = new[] { "~/Views/{1}/{0}.vxml", "~/Views/Shared/{0}.vxml" };
FileExtensions = new[] { "vxml" };
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
controllerContext.HttpContext.Response.ContentType = "text/vxml";
return base.CreateView(controllerContext, viewPath, masterPath);
}
}
并在 Application_Start 中声明自定义扩展:
RazorCodeLanguage.Languages.Add("vxml", new CSharpRazorCodeLanguage());
WebPageHttpHandler.RegisterExtension("vxml");
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new VXMLViewEngine());
以及 web.config 中的自定义构建提供程序将识别 .vxml
扩大:
<compilation debug="true" targetFramework="4.0">
<assemblies>
...
</assemblies>
<buildProviders>
<add extension=".vxml" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</buildProviders>
</compilation>
现在你可以使用 .vxml
作为视图的扩展。由于 Visual Studio 无法识别 .vxml
扩展名,当您用它打开文件时,它不会因警告而打扰您。您甚至可以创建一个自定义 VS 插件,为该自定义扩展提供语法突出显示和智能感知。
其他提示
对于 2,我建议实现一个自定义 ActionResult,它将自动设置 ContentType。stackoverflow 和 google 上有很多示例,可以准确地向您展示如何实现这一目标。
对于 1,您不能仅禁用“选项>文本编辑器>HTML>验证”下的“显示错误”选项吗
有一个 名为 VoiceModel 的开源项目 它有一个使用 ASP.NET MVC 3、Razor 和 C# 创建 VoiceXML 应用程序的框架。它支持可重用对话框组件(RDC)并且非常灵活。有 源代码中的示例 以及有关如何使用它的文档 这个博客.
不隶属于 StackOverflow