标签: viewengine

使用备用视图引擎有什么好处?

我正在玩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 viewengine spark-view-engine

5
推荐指数
1
解决办法
597
查看次数

使用ASP.NET MVC作为电子邮件模板引擎:好主意?

使用ASP.NET MVC视图引擎呈现通过电子邮件发送的html是一个好主意和可执行文件吗?

我知道可以让视图呈现为字符串.这可以用来构建邮件消息.由于ASP.NET MVC已经在应用程序中使用,因此我可以使用所有实用的ASP.NET MVC,而无需使用Brail或NVelocity作为我的"邮件视图".

好主意?有什么警告吗?例子 :) ?

email asp.net-mvc templates viewengine

5
推荐指数
1
解决办法
1740
查看次数

MVC Razor ViewEngine不是线程安全的吗?

我目前有一个.net mvc3应用程序,负责管理多个位置的类似视图,这些位置也使用相同的控制器,例如site1/v1/views/index.cshtmlsite1/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类不是线程安全有关.

有没有人对我如何能够以不同的方式实现相同的结果有任何想法?

提前致谢.

asp.net-mvc viewengine razor

5
推荐指数
1
解决办法
1272
查看次数

Razor View Engine不搜索区域视图位置

我正在使用默认的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)

routes viewengine razor asp.net-mvc-3

5
推荐指数
1
解决办法
3408
查看次数

Nustache视图引擎ArrayTypeMismatchException

尝试使用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)

.net c# viewengine mustache asp.net-mvc-3

5
推荐指数
1
解决办法
1060
查看次数

C++ Web Framework与嵌入式服务器?

我一直在寻找一个C++ Web框架,它允许我直接在.dll插件中构建GUI控制面板.在过去,我使用过Nancy Framework for .NET Projects,这是非常特殊的(这是我第一次使用这种类型的框架).我找到了一些基于其他Stack Overflow问题的优秀候选人,但是我无法弄清楚哪些(如果有的话)有嵌入式Web服务器.

C++服务器页面 - 看起来很奇怪,但是运行在IIS或Apache之上.

CppCMS - 不断推荐,但是它有嵌入式服务器吗?

TreeFrog - 也推荐,但似乎有非常破碎的文档?

建议将哪一个用于完全嵌入式解决方案?易用性也是一个巨大的优势,但我愿意花时间让它工作,只要它能够满足需要.谢谢!

c++ embeddedwebserver web-frameworks viewengine cppcms

5
推荐指数
1
解决办法
1853
查看次数

未找到部分视图时故障转移到备用视图?

我有一个MVC应用程序,它使用从父对象类型继承的动态业务对象.例如,基类Client可能有两个子类调用VendorServiceProvider,而这些都是由同一个控制器来处理.我有一个部分视图,我在查看客户端的详细信息时加载到页面的右侧_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)

asp.net-mvc partial-views viewengine razor

5
推荐指数
2
解决办法
2703
查看次数

ASP.NET MVC:多视图文件夹和_ViewStart.cshtml文件

我有一个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/.

这可能吗?

谢谢

asp.net-mvc viewengine razor asp.net-mvc-3

5
推荐指数
1
解决办法
7457
查看次数

在视图引擎中指定位置时,为什么viewstart文件中需要布局的完整路径?

我正在玩剃刀视图引擎,而且还有一些我不太了解的东西.

_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.

所以我还是有点困惑,但希望这将是一些使用到任何人来到这里.此外,这篇文章也可能有所帮助.

asp.net-mvc viewengine razor

5
推荐指数
1
解决办法
1093
查看次数

在 MVC 5 中仅针对指定区域在自定义位置搜索视图文件

我希望以首先找到我的页面的方式覆盖 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' 方法返回空 [第一个问题] …

asp.net-mvc routing viewengine asp.net-mvc-5

5
推荐指数
1
解决办法
2146
查看次数