如何从RazorEngine cshtml模板中调用“Action”?

时间:2013-07-24 10:28:56

标签: c# asp.net-mvc razor

我正在使用RazorEngine(razorengine.codeplex.com)。

如何从我的cshtml模板中调用'Action'?我引用'Action'因为它不是MVC意义上的Action,因为RazorEngine与MVC分离并且我从WPF解决方案中运行它。基本上我需要的是如下内容:(请注意下面的内容是严格的伪代码,旨在说明一个想法)

<!DOCTYPE html>
<html>
    <head></head>
    <body>

        <!-- something similar to the following so that I can 
             include partial views where needed. -->
        @Html.Action("Method1")

        @Html.Action("Method2")

<!-- or -->

        @Html.Action("RazorTemplate1.cshtml")

        @Html.Action("RazorTemplate2.cshtml")

<!-- or -->

        @MyTemplateFunctionality.Method1()

        @MyTemplateFunctionality.Method2()
    </body>
</html>

定义方法的地方,例如

public static class MyTemplateFunctionality
{
    public static string Method1(string templateName)
    {
        // execute functionality to render HTML output for Method1
        string htmlOutput = RazorEngine.Razor.Parse(templateName, new { ObjModelForMethod1 }); ;

        return htmlOutput;
    }

    public static string Method2(string templateName)
    {
        // execute functionality to render HTML output for Method2
        string htmlOutput = RazorEngine.Razor.Parse(templateName, new { ObjModelForMethod2 }); ;

        return htmlOutput;
    }
}

这可能吗?如果是这样,我需要做什么?

1 个答案:

答案 0 :(得分:2)

您可以通过以下方式实现这一目标:

@Html.Method1("yourtemplatename")

@Html.Method2("yourtemplatename")

但是,您必须使用Method1Method2扩展方法:

public static string Method1(this HtmlHelper htmlHelper, string templateName)

public static string Method2(this HtmlHelper htmlHelper, string templateName)

OP编辑

是的,这是正确的想法。当你回答它的时候,我更多地探索了一下,我找到了related problem which answers this question completely,所以我决定在这里包括完整的答案(作为你的答案的一部分,所以我可以将它标记为正确!),以备将来参考

完整的答案是:

namespace MyCompany.Extensions
{
    public static class MyClassExtensions
    {
        public static string ExtensionMethod1(this MyClass myClass)
        {
            myClass.DoStuff();
            return "whatever I want my string to be";
        }

        public static string ExtensionMethod2(this MyClass myClass)
        {
            myClass.DoOtherStuff();
            return "the output of ExtensionMethod2";
        }
    }

    public class MyClass
    {
        public void DoStuff()
        {
            // do whatever
        }

        public void DoOtherStuff()
        {
            // do whatever else
        }
    }
}

然后在cshtml中,只需添加:

@using MyCompany.Extensions
@using MyCompany

@{
    var myInstance = new MyClass();
    @myInstance.ExtensionMethod1()

    @myInstance.ExtensionMethod1()
}