Пользовательские поля Sharepoint xslt и пользовательские свойства

У меня есть настраиваемое поле Sharepoint с пользовательским свойством строки. Он работает отлично, я могу установить свойство с помощью моего пользовательского элемента управления, и значение сохраняется. Я хочу настроить отображение поля в виде списка, используя мой XSL-файл и в соответствии со значением настраиваемого свойства.

Как я могу получить это значение?

[EDIT] Это поле определения xml:

<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">Secure</Field>
    <Field Name="ParentType">Text</Field>
    <Field Name="TypeDisplayName">Secure</Field>
    <Field Name="TypeShortDescription">Secure Field</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="ShowOnListCreate">TRUE</Field>
    <Field Name="ShowOnSurveyCreate">TRUE</Field>
    <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
    <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
    <Field Name="Sortable">FALSE</Field>
    <Field Name="Filterable">FALSE</Field>
    <Field Name="FieldTypeClass">MyProject.SecureFields.SecureField, $SharePoint.Project.AssemblyFullName$</Field>
    <Field Name="FieldEditorUserControl">/_controltemplates/SecureFieldPropertyEditor.ascx</Field>
    <PropertySchema>
      <Fields>
        <Field Name="ShowedFieldName" Hidden="TRUE" DisplayName="ShowedFieldName" Type="Text" MaxLength="255">
          <Default></Default>
        </Field>
      </Fields>
    </PropertySchema>
  </FieldType>
</FieldTypes>

И это XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
                version="1.0"
                exclude-result-prefixes="xsl msxsl ddwrt"
                xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
                xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:SharePoint="Microsoft.SharePoint.WebControls"
                xmlns:ddwrt2="urn:frontpage:internal">

  <xsl:template match="FieldRef[@FieldType = 'Secure']" mode="Text_body">
    <xsl:param name="thisNode" select="." />
    <xsl:variable name="showedFieldName" select="./@*[name()=current()/@ShowedFieldName]" />
    <span style="background-color:lightgreen;font-weight:bold">
      <xsl:value-of select="$showedFieldName"/>      
    </span>
  </xsl:template>

</xsl:stylesheet>

2 ответа

Решение

Я схожу с ума от нехватки парней MS и документации MSDN. Может быть, эта справка сработала для моего пользовательского типа поля (пользовательское свойство с именем LinkType):

    <xsl:template match="FieldRef[@FieldType = 'EnhancedTitleField']" mode="Text_body">

    <xsl:param name="thisNode" select="."/>
    <xsl:variable name="linkType" select="$thisNode/@LinkType" />
    <xsl:choose>
      <xsl:when test="$linkType=''">
        empty
      </xsl:when>
      <xsl:otherwise>
        link
      </xsl:otherwise>
    </xsl:choose>


  </xsl:template >

... Позже, после нескольких часов тестирования, может быть найдено решение. Когда я наследую свое поле от "SPFieldMultiLineText", owerride "GetFieldValueAsHtml" и изменяю определение поля, оно начинает работать. Вот ключевой код рабочей комбинации:

<Field Name="ParentType">Note</Field>
<Field Name="CAMLRendering">TRUE</Field>
<Field Name="AllowBaseTypeRendering">TRUE</Field>

<RenderPattern Name="DisplayPattern">
  <Column Name="ID" /><HTML><![CDATA[;]]></HTML><Column Name="Title" /><HTML><![CDATA[;]]></HTML><PageUrl WebRel="FALSE" URLEncode="TRUE"/>
</RenderPattern>

В коде:

EnhancedTitleField : SPFieldMultiLineText

...

public override string GetFieldValueAsHtml(object value)
{

    string[] splitedValue = value != null ? value.ToString().Split(';') : new string[0];

    int id = splitedValue.Length > 0 ? int.Parse(splitedValue[0]) : 0;
    string title = splitedValue.Length > 1 ? splitedValue[1] : "";
    string source = splitedValue.Length > 2 ? splitedValue[2] : "";

    string html = EnhancedTitleFieldControl.GetHtml(this, id, title, source);

    return html;
}

Каким-то образом в SPFieldMultilinetext CAML сгенерированное значение передается этому методу. Таким образом, вы можете подготовить данные контекста из caml для обработки в этом методе, где вы имеете доступ к обычным свойствам!

Надеюсь, что это поможет:), и ребята из MS, ДЕЛАЙТЕ ЧТО-ТО с документацией MSDN!

Можете ли вы дать нам больше информации о вашей структуре?! Но, конечно, вы можете попытаться использовать условия вашего поля.

Другие вопросы по тегам