Ich benutze die Razor-View-Engine, um HTML zu rendern, das dann in einem XML-Dokument gespeichert wird. Die Basisklasse, die ich verwende, hat eine Reihe von Eigenschaften, zusammen mit einer statischen Methode, die eine Liste dieses Objekts zurückgibt (mit Dapper, um die Liste aufzufüllen). Ich habe Probleme beim Ausführen der Methode, da es die Basisklasse zurückgeben muss, die eine abstrakte Klasse ist. Einige Beispielcode ist unten.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dapper;
using System.Data.SqlClient;
using System.Configuration;
using System.ComponentModel;
using System.IO;
namespace LocalBranchesPOC
{
public abstract class PersonData : TemplateBase
{
#region Properties
public string RecordId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string County { get; set; }
public string State { get; set; }
public string Country { get; set; }
public string Zip { get; set; }
public string Phone { get; set; }
public string Variable1 { get; set; }
public string Variable2 { get; set; }
public string Variable3 { get; set; }
#endregion
public static List<PersonData> GetPeople()
{
const string QUERY = "SELECT [RecordId], [Name], [Address], [City], [County], [State], [Country], [Zip], [Phone], [Variable1], [Variable2], [Variable3] FROM Data.Person";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["BranchLocator"].ConnectionString))
{
return getPeople(QUERY, conn);
}
}
private static List<PersonData> getPeople(string QUERY, SqlConnection conn)
{
conn.Open();
var result = conn.Query<PersonData>(QUERY).ToList();
conn.Close();
return result;
}
}
public abstract class TemplateBase
{
[Browsable(false)]
public StringBuilder Buffer { get; set; }
[Browsable(false)]
public StringWriter Writer { get; set; }
public TemplateBase()
{
Buffer = new StringBuilder();
Writer = new StringWriter(Buffer);
}
public abstract void Execute();
// Writes the results of expressions like: "@foo.Bar"
public virtual void Write(object value)
{
// Don't need to do anything special
// Razor for ASP.Net does HTML encoding here.
WriteLiteral(value);
}
// Writes literals like markup: "<p>Foo</p>"
public virtual void WriteLiteral(object value)
{
Buffer.Append(value);
}
}
}
Im Grunde PersonData.GetPeople()
mein Aufruf an PersonData.GetPeople()
fehl, da die PersonData-Klasse abstrakt ist. Irgendwelche Gedanken würden geschätzt werden. Ich benutze das Beispiel von hier als meinen Leitfaden.
Sie versuchen, das Modell und die Ansicht zusammenzuführen.
Tu das nicht; Es kann unmöglich funktionieren.
Übergeben Sie das Modell stattdessen an die Ansicht als eine separate Eigenschaft, möglicherweise laden Sie es in dem TemplateBase
Konstruktor.