4

我创建了一个部分类来扩展默认 spmetal 类来处理发布 html 字段。如此处所述:

扩展对象关系映射

片段来自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
}

来自“webpart”的片段:

    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;return null,但item.Fields.GetFieldByInternalName工作正常?
  2. 有没有办法GetFieldValueAsText在 webpart 中使用该方法,或者将值存储在自定义属性中以便以后访问的方法是否可以接受?
4

1 回答 1

0
  1. 您正在将字段值item[CONTENT_FIELDtesthtml]转换为 type HtmlField。但是HtmlField表示字段的类型而不是字段值的类型。因此HtmlField html将被分配null. 检查此MSDN 页面以获取所有发布字段类型和值类型的参考。
    我不确定 a 的字段值类型HtmlField是什么。大概只是string
    所以你应该安全地将它转换为字符串:

    string html = Convert.ToString(item[CONTENT_FIELDtesthtml]);
    
  2. 我认为将值存储在属性中是可行的方法。这样你就实现了数据层和表示层的分离。

于 2012-01-09T09:10:45.470 回答