2012-01-09 18 views
4

我創建了一個部分類來擴展默認spmetal類以處理髮布html字段。由於這裏概述:將linq擴展爲共享點以發佈HTML字段

Extending the Object-Relational Mapping

段從public partial class RelatedLinksItem : Item, ICustomMapping

/// <summary> 
/// Read only data is retrieved in this method for each extended SPMetal field 
/// Used to Read - CRUD operation performed by SPMetal 
/// </summary> 
/// <param name="listItem"></param> 
[CustomMapping(Columns = new string[] { CONTENT_FIELDtesthtml, CONTENT_FIELDLink })] 
public void MapFrom(object listItem) 
{ 
    SPListItem item = (SPListItem)listItem; 

    // link 
    this.ContentLink = item[CONTENT_FIELDLink] as LinkFieldValue; 

    // html (does NOT work) 
    HtmlField html = item[CONTENT_FIELDtesthtml] as HtmlField; // this returns null 

    // html (does work) 
    HtmlField html2 = (HtmlField)item.Fields.GetFieldByInternalName(CONTENT_FIELDtesthtml); // this returns object 
    this.Contenttesthtml = html2; 
    this.TestHtml = html2.GetFieldValueAsText(item[CONTENT_FIELDtesthtml]); // set property for rendering html 
} 

段從 「Web部件」:

protected override void CreateChildControls() 
    { 
     using (OrganisationalPoliciesDataContext context = new OrganisationalPoliciesDataContext(SPContext.Current.Web.Url)) 
     { 
      var results = from links in context.RelatedLinks 
          select links; 

      foreach (var link in results) 
      { 
       // render link 
       Controls.Add(new LiteralControl(string.Format("<p>Link: {0}</p>", link.ContentLink))); 

       // render html 
       Controls.Add(new LiteralControl(string.Format("<p>HTML: {0}</p>", link.TestHtml))); 
      } 
     } 
    } 

兩個問題:

  1. 爲什麼HtmlField html = item[CONTENT_FIELDtesthtml] as HtmlField;返回null,但item.Fields.GetFieldByInternalName工作正常嗎?
  2. 有沒有辦法從 webpart中使用GetFieldValueAsText方法,或者是將值存儲在自定義 屬性中以訪問以後可接受的方法?

回答

0
  1. 您的item[CONTENT_FIELDtesthtml]字段值鑄造類型HtmlField。但HtmlField代表字段的類型而不是字段值的類型。因此HtmlField html將被分配null。查看此MSDN page以獲取所有發佈字段類型和值類型的參考。
    我不確定HtmlField的字段值類型是什麼。可能只是string
    所以,你應該是安全的將其轉換爲字符串:

    string html = Convert.ToString(item[CONTENT_FIELDtesthtml]); 
    
  2. 我認爲存儲在屬性的值是要走的路。這樣你就可以實現數據層和表示層的分離。