剃刀引擎模板中的类

是否可以在模板中创建类? 就像是…

@{ public class MyClass { public MyClass() { Three = new List(); } public string One { get; set; } public int Two { get; set; } public List Three { get; set; } } } 

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

我将在此处发布CodePlex讨论的回复:

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

 public void Execute() { this.Clear(); public class MyClass { public MyClass() { Three = new List(); } public string One { get; set; } public int Two { get; set; } public List Three { get; set;} } } 

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

可以做的是使用自定义基本模板:

 public class CustomTemplateBase : TemplateBase { 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"; } 

@Instance.One

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

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

 @functions { public class MyClass { public MyClass() { Three = new List(); } public string One { get; set; } public int Two { get; set; } public List Three { get; set; } } } 

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

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