2012-02-10 11 views
1

私の最善の努力にもかかわらず、私は自分の雇用主から、便利なものの代わりにSharepointを使用してWebアプリケーションを開発することを任されました。ビジュアルWebパーツ内でネストされたユーザーコントロールが使用されない

Visual Studio 2010のSharepointプロジェクトでユーザーコントロールをビジュアルWebパーツに埋め込む際に問題があります。次の手順を使用しています。このコードは、実際のコードとしての概要です現在、私はStackOverflowから禁止されています):

  1. 新しい空のSharepointプロジェクトを作成します。

  2. MyControl.ascx

MyControl.ascxという名前の、(ControlTemplatesにある)プロジェクトにユーザーコントロールを追加します。

<asp:TextBox runat="server" ID="txtStuff" /> 

MyControl.ascx.cs:

public class MyControl : UserControl 
{ 
    public int Property { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     txtStuff.Text = "I hate you sharepoint"; 
    } 
} 
  1. ビジュアルWebパーツをプロジェクト、MyWebPart.ascx

MyWebPart.ascx

<%@ Register TagPrefix="c" TagName="MyControl" src="~/_controlTemplates/MyControl" %> 
<c:MyControl runat="server" ID="mycontrol" /> 

私はこのポイントを取得する場合、私はおそらくよりは、VSが存在を知られていないため、MyControlとするために任意のインテリセンスを得ることはありません.ascxファイルの私はまた、それが存在しないことを私に知らせる制御名の下に緑の波線を得る。しかし、私はまだSharepointサーバーにプロジェクトを展開することができ、すべて正常に動作します。

MyWebPart.ascx.csたSystem.Web.UI「のエラーが生成さ

protected void Page_Load(object sender, EventArgs e) { 
    mycontrol.Property = 1234; 
} 

:私はコントロール自体との相互作用に有用何もする必要がある場合

しかし、これは崩壊してしまいます。 UserControlには、 'Property'の定義と拡張メソッド... 'が含まれていません。designer.csファイルは実際にコントロールをUserControlとして指定し、その実タイプは指定しません。

これでビルドエラーが発生するため、私はSharepointサービスにプロジェクトを展開できませんr、私は本当にこのintellisenseの問題を回避することはできません。

これは非常に矛盾した動作であることがわかりました。プロジェクトが現在サーバーに展開されているかどうかに応じて、インテリセンスが表示されることがあります。しかし、開発環境を稼働状態にするために私が取ることができた予測可能なステップはありません。

どのような考えですか?私が試した事があります:

  • WebパーツのASCXを右クリックして "Open With ..."をクリックし、 "With Encoding"オプションを選択してください。無効。

  • アプリケーションのデプロイメントとリトラクトの両方で開発し、.ascxファイル、ソリューション、およびVisual Studio自体のクローズと再オープンのさまざまな組み合わせを使用します。時には作品は、時にはしません。

  • プロジェクトの「デバッグ後の自動退避」オプション(ナレッジベース記事から推奨)を無効にしました。無効。

  • +0

    解決策はありますか?私は同じページにこだわっています。 –

    答えて

    1

    ビジュアルウェブパーツを作成するときは、「無料」のコントロールが得られます。 VWPを作成し、事前に作成するのではなく、そのコントロールにあなたのものを貼り付けます。

    既に作成したコントロールを使用する場合は、通常のWebパーツを作成してCreateChildControls()をオーバーライドし、そこにコントロールインスタンスを作成します。あなたが既にコントロールを持っていれば、VWPに慣れ親しんではいけません.Webツールはあなたが知らないバインディングを作成する可能性が最も高いからです。

    +0

    それほど有用ではありません。 ASP.NET開発の基本原則の1つは、ページまたは他のユーザーコントロール全体でユーザーコントロールを再利用できることです。 – MisterZimbu

    +1

    そうです。私は、通常のWebパーツの代わりにビジュアルWebパーツを使用する場合は、VWPを作成するときに与えられたコントロールを使用する必要があると言っています。その後、コントロールを別々に再利用するか、Webパーツを任意の数のページに配置することができます。 事前にコントロールを作成する場合は、ビジュアルWebパーツを使用しないでください。通常のWebパーツを作成し、CreateChildControls()でコントロールインスタンスを自分で作成します。 – Tobias

    +0

    私はあなたが問題を理解しているかどうかは分かりません。問題は、VWPによって既に生成されたASCX内でユーザーコントロールを使用できないことです。私は複雑な一連のWebパーツを作成する必要があります。一般的なユーザーコントロールはこれらのWebパーツで使用する必要がありますが、今はVSのひどいバグSharepoint Projectテンプレートではできません。 今のところ私はいくつかの回避策を考えることができますが、現時点では本当に望ましいものはありません。 – MisterZimbu

    1

    ascxに参照タグを書き込んでいるときに、VSでbrowse-opportunityを使用してみましたか?参照が正しいことを確認する必要があることだけのSrcに=」

    を入力した後に表示されます。

    また、あなたのコードビハインドで、ユーザーコントロールで作業する場合、あなたはそれにキャストする必要がありますに適切なタイプですVSのデザイナーファイルで常にUserControlとして識別されるため、定義したプロパティにアクセスできるようにしてください。

    +0

    キャストは、私が考えていたが、離れていない、2つの理由から回避しようとする回避策の1つでした:1)不規則なコードになり、不必要な場所に物をキャストする必要がありました。 .ASCXファイルにインテリセンスがあります。 VS11でバグが修正される可能性があります。 – MisterZimbu

    +0

    私は実際に私のascxファイルでintellisenseを取得します。それは、VSがSrcパラメータのリファレンスを解決できることに依存していると考えています。私が示唆したようにアスコックスを試してみましたか? –

    +0

    時々私はintellisenseを取得し、時々私はしません。時には私が得るintellisenseは.ascx自体の何世紀ものバージョンからです。私がIntellisenseを取得すると、.designerファイル内のユーザーコントロールのタイプも適切に設定されます。私は中心的な問題はGACにあると思っていますが、導入、撤回、またはVisual Studioの再起動の組み合わせによって、Intellisenseのアップデートの一貫した動作を得ることができませんでした。 – MisterZimbu

    1

    MyWebPart.ascxとMyWebPart.ascx.csを表示します。MyWebPart.csも持っていると思います。 このMyWebPart.csは、userControl MyWebPart.ascxをロードします。

    あなたはsometこのよう興:

    private const string _ascxPath = @"~/_CONTROLTEMPLATES/YourPath/MyWebPart.ascx"; 
    
        protected override void CreateChildControls() 
        { 
         Control control = Page.LoadControl(_ascxPath); 
         Controls.Add(control); 
        } 
    

    あなたが視覚的Webパーツ内の別のユーザーコントロールを追加したい場合は、ハイブの下にマークアップを取り、それをMyWebPart.ascxがロードされているのと同じ方法をロードする必要があります。

    例:あなたのMyWebPart.ascxで今

    private const string _ascxPath = @"~/_CONTROLTEMPLATES//YourPath/MyWebPart.ascx"; 
    private const string _ascxPath2 = @"~/_CONTROLTEMPLATES/YourPath/MyControl.ascx"; 
    
    protected override void CreateChildControls() 
    { 
        Control control = Page.LoadControl(_ascxPath); 
        Control control2 = Page.LoadControl(_ascxPath2); 
        Controls.Add(control); 
        Controls.Add(control2); 
    } 
    

    、ユーザーコントロールMyControlとは、あなたがコントロールをこのように登録する必要があります。iisreset 1の後に、GACに配備されていると仮定:

    <%@ Register TagPrefix="MyTag" TagName="MyControl" Namespace="MyNamespace.Something" Assembly="MyAssembly.Something, version=1.0.0.0, Culture=neutral" %> 
    

    これをインテリセンスとあなたの特性へのアクセスが必要な方法

    関連する問題