Связь с веб-частью Sharepoint 2010 - как заставить потребителя ждать поставщика - PullRequest
0 голосов
/ 22 июня 2011

У меня есть ряд веб-частей, которые необходимо реализовать в SharePoint 2010. Веб-часть поставщика данных использует UpdatePanel и асинхронно выполняет вызов веб-службы, который потенциально может быть медленным. Чтобы было проще, я поместил на страницу (диаграмму) одну потребительскую веб-часть, которая будет использовать потребителя в качестве поставщика данных.

Моя проблема в том, что я не могу заставить потребителя ждать поставщика - я получаю множество ошибок, но все в основном возвращаются к «Нет доступных данных». Это может быть связано с тем, что это веб-часть Chart, но этот вопрос также относится к другим пользовательским частям, которые я буду разрабатывать, поскольку они будут извлекать те же данные.

Вопрос заключается в следующем: как я могу передать данные своим потребителям, когда мой провайдер готов, или каким-то образом позволить им подождать, пока мой провайдер получит данные (через опрос или что-то еще).

Примечание: это всего лишь прототип, я еще не добавил обработку ошибок и т. Д.

Код ниже:

[ToolboxItem(true)]
public partial class ClarityProjectGeneral : System.Web.UI.WebControls.WebParts.WebPart , IWebPartTable
{

    public DataTable ProjectVitals = new DataTable(); For web part communication

    // bunch of properties

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        InitializeControl();

        // For web part communication
        // Initialize our datatable so the chart doesn't barf
        DataColumn col = new DataColumn();
        col.DataType = typeof(string);
        col.ColumnName = "Name";
        this.ProjectVitals.Columns.Add(col);

        col = new DataColumn();
        col.DataType = typeof(DateTime);
        col.ColumnName = "Start";
        this.ProjectVitals.Columns.Add(col);

        col = new DataColumn();
        col.DataType = typeof(DateTime);
        col.ColumnName = "End";
        this.ProjectVitals.Columns.Add(col);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        loading.Visible = true;
        content.Visible = false;            
    }

    public ClarityObjectClasses.Projects GetProject(string projectID)
    {
        Clarity.ClarityAbstractorProject ca = new Clarity.ClarityAbstractorProject(this.Username, this.Password);
        Dictionary<string, string> queryParams = new Dictionary<string, string>();
        queryParams.Add("projectID", projectID);
        // Class for making web service call
        ClarityObjectClasses.Projects response = new ClarityObjectClasses.Projects();
        response = ca.GetProject(queryParams);
        return response;
    }

    protected void Timer1_Tick(object sender, EventArgs e)
    {
        if (this.ProjectID == null || this.Username == null || this.Password == null)
        {
            lblConfigError.Visible = true;
            lblConfigError.Text = "One or more required configuration values are not set.  Please check the web part configuration.";
            panelProjectDetails.Visible = false;
        }
        else
        {
            loading.Visible = true;
            content.Visible = false;

            panelProjectDetails.Visible = true;
            ClarityObjectClasses.Projects projects = GetProject(this.ProjectID);
            //Assign a bunch of values

            // For web part communication
            LoadTable(projects.Project[0]);

            Timer1.Enabled = false;
            loading.Visible = false;
            content.Visible = true;
        }
    }


    /* Interface functions for Graph Chart communication */
    For web part communication
    protected void LoadTable(ClarityObjectClasses.Project project)
    {
        DataRow row = ProjectVitals.NewRow();
        row["Name"] = project.name;
        row["Start"] = project.start;
        row["End"] = project.finish;
        this.ProjectVitals.Rows.Add(row);
    }

    public PropertyDescriptorCollection Schema
    {
        get
        {
            return TypeDescriptor.GetProperties(ProjectVitals.DefaultView[0]);
        }
    }

    public void GetTableData(TableCallback callback)
    {
        callback(ProjectVitals.Rows);
    }

    public bool ConnectionPointEnabled
    {
        get
        {
            object o = ViewState["ConnectionPointEnabled"];
            return (o != null) ? (bool)o : true;
        }
        set
        {
            ViewState["ConnectionPointEnabled"] = value;
        }
    }

    [ConnectionProvider("Table", typeof(TableProviderConnectionPoint), AllowsMultipleConnections = true)]
    public IWebPartTable GetConnectionInterface()
    {
        return this;
    }

    public class TableProviderConnectionPoint : ProviderConnectionPoint
    {
        public TableProviderConnectionPoint(MethodInfo callbackMethod, Type interfaceType, Type controlType, string name, string id, bool allowsMultipleConnections)
            : base(callbackMethod, interfaceType, controlType, name, id, allowsMultipleConnections)
        {
        }

        public override bool GetEnabled(Control control)
        {
            return ((ClarityProjectGeneral)control).ConnectionPointEnabled;
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 22 января 2013

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

Поэтому я отразил XsltListViewWebPart (или как там его точное имя) и обнаружил, что существует IConnectionData интерфейс.Это позволяет вам указать зависимости и получить правильную привязку задержки, которая вам нужна.GetRequiresData указывает, что есть еще больше соединений, которые необходимо использовать, прежде чем данные могут быть запрошены.

0 голосов
/ 22 июня 2011

Не совсем понял, но если это поможет Вы не можете использовать «подключаемые» веб-части внутри UpdatePanel, из-за отсутствия соответствующих событий для привязки данных при асинхронном обратном вызове.

...