我正在使用MVC for REST,以便我可以利用Razor來輸出不同類型的數據。 CSV是其中的一個輸出。而不是寫這個模板爲每個輸入類型:對值類型和引用類型使用C#LINQ表達式
ID,Created,Content
@foreach (var item in Model.TimeData)
{
<text>@item.ID,@item.Created,"@Html.Raw(item.Content.Replace("\"", "\"\""))"</text>
}
我想利用params
和System.Linq.Expressions.Expression
寫的是這樣的:
@{
Html.WriteCsv<TimeObject>(Model.TimeData, p => p.ID, p => p.Created, p => p.Content);
}
我開始寫一個通用的HtmlHelper
,並很快意識到我有值類型的問題(memberExpression將爲null)。下面的代碼試圖只寫出來的CSV標題(ID,創建,內容),但它僅輸出「內容」(因爲ID和創建的值類型(int
和DateTime
)。
public static void WriteCsv<TModel>(this HtmlHelper htmlHelper, List<TModel> list, params Expression<Func<TModel, object>>[] expressions)
{
foreach (var expression in expressions)
{
MemberExpression memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var propertyInfo = (PropertyInfo)memberExpression.Member;
htmlHelper.ViewContext.Writer.Write(propertyInfo.Name + Environment.NewLine);
}
}
}
我試圖更換object
與dynamic
,認爲會的工作,但是當我快看expression.Body
,似乎仍然認爲它在處理一個對象(DebugView
屬性爲(System.Object)$p.ID
)。
這是不可能在C#4.0?
下面是我使用它的類型:
[DataContract(IsReference = true, Namespace = "urn:test:TimeObject")]
public class TimeObject
{
[DataMember]
public long ID { get; set; }
[DataMember]
public string Content { get; set; }
[DataMember]
public DateTime Created { get; set; }
}
這是切你的問題,但使用自定義的ActionResult會更好。你甚至可以在這裏使用:http://notesfor.net/post/2010/06/28/AspNet-custom-ActionResult-CSV.aspx – Talljoe 2011-04-18 19:05:13
咦?你的代碼應該工作。 – SLaks 2011-04-18 19:05:41
你確定值類型是屬性嗎?也許他們是需要你將字段轉換爲'(FieldInfo)' – Jose 2011-04-18 19:10:46