Расширение linq до sharepoint для публикации полей HTML
Я создал частичный класс для расширения стандартного класса 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
}
Фрагмент из "веб-части":
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)));
}
}
}
Два вопроса:
- Почему
HtmlField html = item[CONTENT_FIELDtesthtml] as HtmlField;
вернутьnull
, ноitem.Fields.GetFieldByInternalName
работает правильно? - Есть ли способ использовать
GetFieldValueAsText
метод изнутри веб-части, или приемлем ли подход сохранения значения в пользовательском свойстве для последующего доступа?
1 ответ
Вы применяете значение поля
item[CONTENT_FIELDtesthtml]
к типуHtmlField
, НоHtmlField
представляет тип поля, а не тип значения поля. таким образомHtmlField html
будет назначен сnull
, Проверьте эту страницу MSDN для ссылки на все типы полей публикации и типы значений.
Я не уверен, что тип значения поляHtmlField
является. Наверное простоstring
,
Так что вы должны безопасно преобразовать его в строку:string html = Convert.ToString(item[CONTENT_FIELDtesthtml]);
Я думаю, что хранение значения в свойстве - это путь. Таким образом, вы достигаете разделения уровня данных и уровня представления.