我正在玩ASP.NET MVC,我发现有一些替代视图引擎可供它使用,例如NHaml和Spark.我的问题是你为什么要使用备用视图引擎?有这样的事情,我认为没有好处:
<ul if="products.Any()">
<li each="var p in products">${p.Name}</li>
</ul>
<else>
<p>No products available</p>
</else>
Run Code Online (Sandbox Code Playgroud)
使用Spark视图引擎(从那以后,我没有使用Spark来验证这一点并且可能完全错误,因为你将代码作为字符串传递,所以你不会得到Intellisense)和:
<% if products.Any() { %>
<ul>
<% foreach (var p in products) { %>
<li><%= p.Name %></li>
<% } %>
</ul>
<% } else { %>
<p>No products available</p>
<% } %>
Run Code Online (Sandbox Code Playgroud)
使用内置的ASP.NET MVC模板格式(虽然我承认悬挂的大括号非常难看).有没有合理的理由除了不喜欢"gator"标签(或悬挂花括号)以考虑使用备用视图引擎?或者它是否很酷,因为它是新的东西?
使用ASP.NET MVC视图引擎呈现通过电子邮件发送的html是一个好主意和可执行文件吗?
我知道可以让视图呈现为字符串.这可以用来构建邮件消息.由于ASP.NET MVC已经在应用程序中使用,因此我可以使用所有实用的ASP.NET MVC,而无需使用Brail或NVelocity作为我的"邮件视图".
好主意?有什么警告吗?例子 :) ?
我目前有一个.net mvc3应用程序,负责管理多个位置的类似视图,这些位置也使用相同的控制器,例如site1/v1/views/index.cshtml和site1/v2/views/index.cshtml.
处理它的方法是创建一个继承自DefaultControllerFactory和CreateController方法的CustomControllerFactory,清除现有的视图引擎并添加一个新的自定义viewEngine,它根据当前url指定视图位置格式.
如果用户登陆site1.com/v1/index.cshtml,则视图引擎将指定以下视图位置:
string versionDirectory = "v1";
ViewLocationFormats = new[]{ versionDirectory + "/Views/{0}.cshtml",
"/Views/{0}.cshtml",
"~/Shared/{0}.cshtml"
};
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,如果多个用户在大致相同的时间落在不同的页面上,则所有用户都将看到相同的视图.
最初我认为这与缓存有关,但是在usecache = false自定义viewEngine中明确设置之后,似乎这与ViewEngines类不是线程安全有关.
有没有人对我如何能够以不同的方式实现相同的结果有任何想法?
提前致谢.
我正在使用默认的RazorViewEngine和Area布局配置,但是当我导航到使用该区域内的视图的链接时。我收到一条错误消息,指出在以下位置找不到和搜索视图:
~/Views/Applications/Details.cshtml
~/Views/Applications/Details.vbhtml
~/Views/Shared/Details.cshtml
~/Views/Shared/Details.vbhtml
Run Code Online (Sandbox Code Playgroud)
我发现奇怪的是,看起来好像视图引擎没有尝试搜索区域位置。我需要进行哪些调整才能使视图引擎在其区域中搜索视图。
这是我用来定义区域的相关代码。
Global.asax.cs
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteRegistrar.RegisterRoutesTo(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)
ApplicationAreaRegistration.cs
private void RegisterRoutesTo(RouteCollection routes)
{
routes.MapRoute("Application_default", AreaName + "/{action}/{applicationId}",
new
{
controller = "Applications",
action = "Index",
applicationDomainId = UrlParameter.Optional
}, new { applicationId = @"\d+" });
}
Run Code Online (Sandbox Code Playgroud)
Index.cshtml
@Html.RouteLink(item.Name, "Application_default", new { applicationId = item.Id, action = "Details" })
Run Code Online (Sandbox Code Playgroud)
物理目录布局
Areas \
\Application
\Controllers
-ApplicationsController.cs
\Views
-Details.cshtml
-ApplicationAreaRegistration.cs
Run Code Online (Sandbox Code Playgroud) 尝试使用Nustache来共享客户端和服务器胡子模板,但Nustache只是不能很好地使用我的应用程序.我在源代码中直接使用了他们的MVC应用程序示例中的代码,但每次尝试设置或添加视图引擎时都会出错.这是一个代码片段(来自一个动作方法,我也试过在global.asax中全局添加视图引擎并且有相同的错误):
ViewResult viewResult = View(new { test = "Jawesome" });
viewResult.ViewEngineCollection = new ViewEngineCollection
{
new NustacheViewEngine()
};
Run Code Online (Sandbox Code Playgroud)
这是错误:
[ArrayTypeMismatchException: Attempted to access an element as a type incompatible with the array.]
System.Collections.Generic.List`1.Insert(Int32 index, T item) +62
MyController.Index() in C:\src\projects\myproject\myproject.Web\Controllers\MyController.cs:83
lambda_method(Closure , ControllerBase , Object[] ) +79
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264
...
Run Code Online (Sandbox Code Playgroud) 我一直在寻找一个C++ Web框架,它允许我直接在.dll插件中构建GUI控制面板.在过去,我使用过Nancy Framework for .NET Projects,这是非常特殊的(这是我第一次使用这种类型的框架).我找到了一些基于其他Stack Overflow问题的优秀候选人,但是我无法弄清楚哪些(如果有的话)有嵌入式Web服务器.
C++服务器页面 - 看起来很奇怪,但是运行在IIS或Apache之上.
CppCMS - 不断推荐,但是它有嵌入式服务器吗?
TreeFrog - 也推荐,但似乎有非常破碎的文档?
建议将哪一个用于完全嵌入式解决方案?易用性也是一个巨大的优势,但我愿意花时间让它工作,只要它能够满足需要.谢谢!
我有一个MVC应用程序,它使用从父对象类型继承的动态业务对象.例如,基类Client可能有两个子类调用Vendor和ServiceProvider,而这些都是由同一个控制器来处理.我有一个部分视图,我在查看客户端的详细信息时加载到页面的右侧_Aside.cshtml.当我加载客户端时,我首先尝试寻找一个特定的Aside,然后我加载了一个通用的.下面是代码的样子.
@try
{
@Html.Partial("_" + Model.Type.TypeName + "Aside")
}
catch (InvalidOperationException ex)
{
@Html.Partial("_Aside")
}
Run Code Online (Sandbox Code Playgroud)
TypeName属性中包含"Vendor"或"ServiceProvider".
现在这个工作正常,但问题是我只希望它在未找到视图时进行故障转移,当InvalidOperationException部分视图实际抛出时(通常是它可能调用的子操作的结果),它也会失败.我想过要检查,Exception.Message但这看起来有点hackish.有没有其他方法我可以得到所需的结果,而无需检查Message属性或这是我唯一的选择吗?
ex.Message = "The partial view '_ServiceProviderAside' was not found or no view
engine supports the searched locations. The following locations were
searched: (... etc)"
Run Code Online (Sandbox Code Playgroud)
更新:这是根据杰克的回答,我目前在我的项目中使用扩展方法的类,以及Chao的建议.
//For ASP.NET MVC
public static class ViewExtensionMethods
{
public static bool PartialExists(this HtmlHelper helper, string viewName)
{
if (string.IsNullOrEmpty(viewName)) throw new ArgumentNullException(viewName, "View …Run Code Online (Sandbox Code Playgroud) 我有一个MVC项目,需要有2个不同的View文件夹.一个是在~/Views/,一个在~/Framework/Views/.这是通过基于剃刀视图引擎创建自定义视图引擎来完成的,如下所示:
public class MyViewEngine : RazorViewEngine
{
private static string[] AdditionalViewLocations = new[]{
"~/Framework/Views/{1}/{0}.cshtml",
"~/Framework/Views/{1}/{0}.vbhtml",
"~/Framework/Views/Shared/{0}.cshtml",
"~/Framework/Views/Shared/{0}.vbhtml"
};
public MyViewEngine()
{
base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AdditionalViewLocations).ToArray();
base.ViewLocationFormats = base.ViewLocationFormats.Union(AdditionalViewLocations).ToArray();
base.MasterLocationFormats = base.MasterLocationFormats.Union(AdditionalViewLocations).ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我想在2个Views文件夹中的每一个中使用不同的_ViewStart.cshtml文件(即~/Views/_ViewStart.cshtml对于在~/Views/文件夹中~/Framework/Views/_ViewStart.cshtml找到的视图和在文件夹中找到~/Framework/Views/的视图),但是View Engine只使用它找到的第一个文件.是原来的~/Views/.
这可能吗?
谢谢
我正在玩剃刀视图引擎,而且还有一些我不太了解的东西.
_ViewStart文件指定具有完整文件路径的布局,如下所示:
@{
Layout = "~/Views/Shared/_MasterLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)
据我了解,必须包括完整的路径和扩展.你不能这样做:
@{
Layout = "_MasterLayout";
}
Run Code Online (Sandbox Code Playgroud)
但是,视图引擎指定搜索主视图的位置:
MasterLocationFormats = new string[] {
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml"
};
Run Code Online (Sandbox Code Playgroud)
为什么_ViewStart文件中需要完整的主布局文件路径?
如果指定了完整路径,那么指定可能位置的重点是MasterLocationFormats[]什么?
更新
好吧,我还没有找到一个满意的答案.
从实验中可以看出,在viewstart文件中指定Layout时,MasterLocationFormats要么被插入要么被覆盖.
我可以从MasterLocationFormats中完全删除MasterLayout.cshtml位置,它对网页的显示没有任何影响.
我的个人问题是由于使用了MvcMailer软件包,它允许您指定剃刀视图以用作发送HTML电子邮件的模板.这个DOES使用MasterLocationFormats.
所以我还是有点困惑,但希望这将是一些使用到任何人来到这里.此外,这篇文章也可能有所帮助.
我希望以首先找到我的页面的方式覆盖 MVC5 的“ViewEngine”。我已经失败了。
其次,它只对单个区域 {root}/{area}/{controller}/{action}/{etc.} 进行操作
就我用谷歌搜索而言,我找到了几个主题和答案,但它们不符合我的需要。所以我宁愿在这里问它,也许我有什么不对......
public class CustomAreaViewEngine:RazorViewEngine
{
public CustomAreaViewEngine()
{
var viewLocations = new[]
{
"~/App/pages/{1}/{0}.cshtml",
"~/App/pages/{1}/{0}.vbhtml"
};
AreaMasterLocationFormats = viewLocations;
AreaPartialViewLocationFormats = viewLocations;
AreaViewLocationFormats = viewLocations;
}
public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
{
var viewEngineResult = base.FindPartialView(controllerContext, partialViewName, useCache);
return viewEngineResult;
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
controllerContext.RouteData.Values["controller"] = controllerContext.RouteData.Values["controller"].ToString().ToLower();
var viewEngineResult = base.FindView(controllerContext, viewName, masterName, useCache);
return viewEngineResult;
}
}
Run Code Online (Sandbox Code Playgroud)
'FindView' 方法返回空 [第一个问题] …