是否可以在模板中创建类?有点像...
@{
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的实例。我不能事先进行反序列化并将其推入模型中,因为类可能因模板而异。
答案 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和代码混合得不好)。