剃刀引擎模板中的类

时间:2011-02-26 20:50:53

标签: c# razor

是否可以在模板中创建类?有点像...

@{
    public class MyClass {
        public MyClass() {
            Three = new List<string>();
        }

        public string One { get; set; }
        public int Two { get; set; }
        public List<string> Three { get; set; }
    }
}

目前我收到“无法编译模板。请查看错误列表以获取详细信息。”当我试着这样做的时候。我想获取XML内容并使用XmlSerializer在模板中创建MyClass的实例。我不能事先进行反序列化并将其推入模型中,因为类可能因模板而异。

3 个答案:

答案 0 :(得分:83)

是的,这是完全可能的。使用@functions关键字:

@functions {
    public class MyClass {
        public MyClass() {
            Three = new List<string>();
        }

        public string One { get; set; }
        public int Two { get; set; }
        public List<string> Three { get; set; }
    }
}

答案 1 :(得分:5)

我会在CodePlex Discussion发布我的回复:

我不确定目前是否可行。当您使用代码块(@ {})时,您实际上是在一个方法中编写代码,例如您的上述代码将执行以下操作:

public void Execute()
{
    this.Clear();
    public class MyClass {
        public MyClass() {
            Three = new List<string>();
        }

        public string One { get; set; }
        public int Two { get; set; }
        public List<string> Three { get; set;}
    }
}

...当然,这是无效的C#。您将面临的另一个问题是,使用xml序列化/反序列化,必须知道类型,但如果您在模板本身中定义类型,那么您如何首先对其进行反序列化?

public class CustomTemplateBase<T> : TemplateBase<T>
{
    public dynamic Instance { get; set; }

    public dynamic CreateInstance(string typeName)
    {
        Type type = Type.GetType(typeName);

        // You'd to your deserialisation here, I'm going to
        // just cheat and return a new instance.
        return Activator.CreateInstance(type);
    }
}

使用动态属性和动态返回类型,我们已经定义了一个方法,它允许我们创建一个实例(通过激活或反序列化等)并在其上调用成员访问。要在模板中使用它,您可以执行以下操作:

@{
  Instance = CreateInstance("ConsoleApplication1.MyClass, ConsoleApplication1");
  Instance.One = "Hello World";
}
<h1>@Instance.One</h1>

“我的应用程序”中某处定义了“MyClass”。重要的是,我正在为每个模板创建一个实例。

答案 2 :(得分:3)

我建议使用一个特定的ViewModel类,该类可以有一个动态属性(ExpandoObject),允许您根据需要使用任何自定义数据结构填充它,同时仍然可以为您的视图可能需要的任何其他内容进行强类型传输。

这也使您的视图模型与视图本身分开,这是一种很好的做法(在可读性问题时,html和代码混合得不好)。