代码之家  ›  专栏  ›  技术社区  ›  Janis Veinbergs

从代码隐藏引用自定义列表表单域并自动用值填充它们

  •  0
  • Janis Veinbergs  · 技术社区  · 15 年前

    我为我的列表制作了自定义newform.aspx,我想在其中添加一些自定义代码。所以我从我自己的阶级继承了这种形式:

    public class MyCustomNewForm : Microsoft.SharePoint.WebPartPages.WebPartPage
    

    现在,我想引用一些可用字段来自动为用户填充它们。(javascript在这里没有帮助,因为我必须从其他列表中获取一些数据)。

    但我不知道如何从代码隐藏文件引用这些字段。

    控件字段的代码是编写的(好吧,它是由SharePoint Designer在使用命令时生成的) 插入>SharePoint控件>自定义列表表单… )在.aspx页面中,如下所示:

    <SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/>
    

    在运行时查看ID时,它非常长

    alt text http://img33.imageshack.us/img33/7495/ss20090713143352.png

    那么如何引用字段,以便设置 文本 我的代码隐藏文件中的属性?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Coral Doe avi pachar    12 年前

    使用 WebDataForm 控制代码隐藏;调用其方法 FindControl(@ID) .

    您可以从生成的HTML页面中找出ID;使用IE开发人员工具,它应该 $ff21_ 例如,在这种情况下 ID = ff21

        2
  •  0
  •   Cœur Gustavo Armenta    6 年前

    不要介意这个痛苦的解决方案,但是向下滚动查看编辑。

    嗯,我找到了一个解决办法。但是 警告! 如果您不需要使用任何SharePoint对象动态访问任何值,则此文章不适用于您,而是希望阅读一些引用的文章。

    因此,要用其他列表中的值在newform.aspx中预先填充一些字段,请执行以下操作。

    简而言之:

    1. 制作自定义列表项窗体。做它 step-by-step .

    2. 生成从继承的类 Microsoft.SharePoint.WebPartPages.WebPartPage

    3. 在自定义表单aspx<%@页上继承该类。我的看起来像这样: Inherits="xx.MeetingWorkspace.Tasks_NewFormxx, xx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"

    4. protected override void OnInit(EventArgs e) 功能使用 FindControlRecursively 寻找 ID为的ContentPlaceholder对象 “Placeholdermin”(叫它 此上的函数。控件[0],而不是打开 这个对象)。

    5. 制作 HtmlHiddenField 对象、指定值并使用方法添加属性“title” HtmlHiddenField.Attributes.Add() . 在第7步中你需要这个。

    6. 将隐藏字段添加到 你得到的ContentPlaceholder 以前。

    7. 使用javascript(读取 here here 到 填写所需字段 这些字段的隐藏字段值 用户看到。

    另外,我是SharePoint的初学者,所以最好谨慎地使用这些步骤。我很高兴找到一个答案,你可以在代码中引用你的字段,所以我不必使用任何javascript东西。

    我的长途旅行: 正如我所提到的,我继承了我自己的公共类。使用这种技术,应该可以通过使用与表单ID相同的变量名声明这些类控件来引用现有的表单字段。 TextBox ID为的类对象 CTL00占位符G U 77625….等。

    现在,在我的类中,我尝试用与id相同的名称创建一个变量,但它不初始化,并且值为空。我想可能身份证被更改了,我检查了一下,但没有,它保持了原来的样子。

    所以我尝试使用control.findcontrol,但它不递归搜索,所以我找到了这篇文章: Recursive Page.FindControl . (您可能希望阅读一些注释,因为有更好的泛型实现)。 重要: 在使用findcontrolRecursive方法之前,请阅读注释“Sam on August 2,2008 4:13 am”。

    所以,有了这个函数,我就把id作为参数传递了——仍然不走运,它只是为我返回了空值。幸运的是,我可以将PlaceholderMin作为ID传递,它将返回主占位符对象。

    因此,解决方法将在overriden方法上 OnInit(EventArgs) 生成htmlhiddenfield对象,将其值设置为所需的值,并将这些隐藏字段添加到placeholdermin。( ContentPlaceHolder.Controls.Add() )

    然后,在ASPX页面上使用一些javascript,我可以将隐藏字段中的值加载到我的首选字段中(我找到了一种方法,可以用javascript引用我想要的字段)。这方面有两篇有用的文章: shorter one longer one )

    编辑:减轻痛苦的解决方案

    哦,很高兴我找到这个。 用 jPoint (jquery for sharepoint),然后通过一些脚本,可以使用querystring参数预填充列表字段。

    <script type="text/javascript" src="//sharejpoint.googlecode.com/files/jPointLoader-0.6-expanded.js" ></script>
    <script>  
      $(document).ready(function() {
        jP.Form.readForm();
        $.each(jP.Form.Items, function (idx, item) {
        if(querySt(item.Name) != null && querySt(item.Name) != "undefined")
          jP.Form[item.Name].val(unescape(querySt(item.Name)));
        });
       });
    
    //Gets value of querystring key
    function querySt(ji)
    {
          hu = window.location.search.substring(1);
          gy = hu.split("&");
          for (i=0;i<gy.length;i++)
          {
                  ft = gy[i].split("=");
                  if (ft[0].toUpperCase() == ji.toUpperCase()) //Fixed query so it is case insensitive
                  {
                          return ft[1];
                  }
          }
    }
    </script>
    

    此脚本可在中的注释中找到 this 文章。