SharePoint 2007列表中自定义NewForm.aspx和EditForm.aspx之间的差异

时间:2011-04-27 17:55:22

标签: sharepoint sharepoint-2007

我正在使用自定义NewForm.aspx和自定义EditForm.aspx的列表中工作,我称之为New.aspx和Edit.aspx。我远不是SharePoint专家,但看起来两个文件之间的唯一区别是整个文件中设置的各种ControlMode属性。

New.aspx的ControlMode =“New”和Edit.aspx的ControlMode =“Edit”

作为测试,我从New.aspx中获取代码并将其复制到Edit.aspx中,并将ControlMode属性更改为“Edit”。一切似乎都很好。所以我想要做的只是使用一个文件而不是单独的文件用于New和Edit。我不确定这是否可行,但我采取的第一步是创建一个XSL变量:

<xsl:variable name="ControlMode" select="'Edit'" />

然后我可以这样做:

<xsl:choose>
  <xsl:when test="$ControlMode = 'New'">
    <SharePoint:AttachmentUpload runat="server" ControlMode="New"/>
    <SharePoint:ItemHiddenVersion runat="server" ControlMode="New"/>
  </xsl:when>
  <xsl:when test="$ControlMode = 'Edit'">
    <SharePoint:AttachmentUpload runat="server" ControlMode="Edit"/>
    <SharePoint:ItemHiddenVersion runat="server" ControlMode="Edit"/>
  </xsl:when>
</xsl:choose>

此时我的表单仍然正常,但它仍然是两个不同的文件。所以问题是,有没有人知道我可以动态填充xsl:变量的方式,以便我只能为新模式和编辑模式指定一个文件?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我不确定回答我自己的问题是否是正确的礼仪,但我发现我的回答......结果比我想象的要简单得多。

在我阅读Brian的回复时,我发现编辑帖子会更改查询字符串。当然有一个ID。所以我开始寻找解析查询字符串的最佳方法。那时我意识到这已经在ParameterBindings中为我完成了:

<ParameterBinding Name="ListItemId" Location="QueryString(ID)" DefaultValue="0"/>

然而,未指定xsl:param标记,因此我将其添加到xsl:stylesheet的顶部:

<xsl:param name="ListItemId"></xsl:param>

然后,我现在可以直接针对ListItemID进行测试,而不是使用我在原始帖子中创建的ControlMode变量:

<xsl:choose>
  <xsl:when test="$ListItemId = '0' or not($ListItemId)">
    <SharePoint:AttachmentUpload runat="server" ControlMode="New"/>
    <SharePoint:ItemHiddenVersion runat="server" ControlMode="New"/>
  </xsl:when>
  <xsl:otherwise>
    <SharePoint:AttachmentUpload runat="server" ControlMode="Edit"/>
    <SharePoint:ItemHiddenVersion runat="server" ControlMode="Edit"/>
  </xsl:otherwise>
</xsl:choose>

基本上,我只是检查0值(在ParameterBinding中指定的默认值)并显示不同的控件。

我今天下午对此进行了一些测试,到目前为止它的工作非常出色。

答案 1 :(得分:0)

内置的sharepoint控件将根据定义的控件模式尝试不同的功能。显然,如果它是编辑,那么它将尝试不仅仅渲染一个控件,而是用当前值填充该控件。如果模式是新的,它将简单地渲染控件而没有预定义的值。还有更多内容,但这是高级概述。

如果您使用的是自定义新修改表单,我会亲自将它们分开以用于组织目的。一个简单的解决方案是在每个页面窗体中定义变量后使用XSL包含。