2011-12-12 73 views
0

我有一個Web部件用於管理與正在進行的促銷相關的評論。 Web部件託管在沙盒解決方案中,因爲所有類型的服務器訪問都受到限制(//共享點)沙盒解決方案中的差列表項提交邏輯

我的代碼有兩個主要問題。

1:提交回發後不出現,讓用戶認爲他們的意見的項目沒有保存,

2:頁面刷新後回傳數據重燒製,如果用戶刷新希望能看到他們的評論的意思,它是重新提交併保存。

我在這裏做錯了什麼?

public string OfferID { get; set; } 
protected void Page_Load(object sender, EventArgs e) 
     { 
      OfferID = Context.Request.QueryString["ItemID"]; 
      LoadOffers(); 
     } 

protected void LoadOffers() 
     { 
      if (!String.IsNullOrEmpty(OfferID)) 
      { 
       PopulateOfferDetails(OfferID); 
       PopulateComments(OfferID); 
       PopulateBestPractices(OfferID); 
      } 
      else 
      { 
       OfferID = "123"; 
       PopulateOfferDetails(OfferID); 
       PopulateComments(OfferID); 
       PopulateBestPractices(OfferID); 
      } 
     } 

protected void PopulateComments(string offerID) 
    { 
     rcOiD.InnerText += " " + offerID; 

     List<Comment> Comments = new List<Comment>(); 
     SPList TargetList = web.Lists.TryGetList("Offer Comments"); 
     SPQuery query = new SPQuery(); 
     query.RowLimit = 100; 
     query.Query = "<Where><Eq><FieldRef Name=\"OfferID\"/><Value Type=\"Text\">" + offerID + "</Value></Eq></Where>"; 
     try 
     { 
      SPListItemCollection items = TargetList.GetItems(query); 
      if (items.Count > 0) 
      { 
       commentsCount.InnerText = items.Count.ToString(); 
       SPUser user = web.CurrentUser; 
       string alias = user.Email.Substring(0, user.Email.IndexOf('@')); 
       string profilePicBase = "<div class=\"profilePic\" " + "style=\"background-image:url('http://who/Photos/XX.jpg');\"" + ">&nbsp;</div>"; 
       foreach (SPListItem item in items) 
       { 
        Comment c = new Comment(); 
        c.Author = ((string)item["Created By"]).CleanUserName(); 
        c.Body = (string)item["Body"]; 
        c.Date = String.Format("{0:MMM dd, yyyy}", (DateTime)item["Created"]); 
        c.ProfilePic = profilePicBase.Replace("XX", alias); 

        Comments.Add(c); 
       } 
       Comments.Reverse(); 
       CommentRepeater.DataSource = Comments; 
       CommentRepeater.DataBind(); 
      } 
      else 
      { 
       commentsCount.InnerText = "0"; 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

protected void SubmitListItem(object sender, EventArgs e) 
     { 
      if (Page.IsPostBack) 
      { 
       SPUser user = web.CurrentUser; 
       string alias = user.Email.Substring(0, user.Email.IndexOf('@')); 
       if (ListChoice.SelectedItem.Text == "comment") 
       { 
        SPList TargetList = web.Lists.TryGetList("Offer Comments"); 
        SPListItem item = TargetList.Items.Add(); 
        item["Title"] = TitleBox.Text; 
        item["Body"] = BodyBox.Text; 
        item["OfferID"] = OfferID; 
        item["Alias"] = alias; 
        item.SystemUpdate(); 
        TargetList.Update(); 
       } 
       else 
       { 
        SPList TargetList = web.Lists.TryGetList("Offer Best Practices"); 
        SPListItem item = TargetList.Items.Add(); 
        item["Title"] = TitleBox.Text; 
        item["Body"] = BodyBox.Text; 
        item["OfferID"] = OfferID; 
        item.SystemUpdate(); 
        TargetList.Update(); 
       } 
      } 
     } 

編輯:我可以證實這不是一個數據綁定()問題。正在渲染的item.count被正確渲染,但仍然是1個項目。

回答

1

我認爲SubmitListItem是頁面上的控件的事件處理程序。
如果是這樣,那麼就像你之前的問題一樣,Page_Load在任何控件的事件處理函數之前被觸發。 因此,在回發中,您的中繼器在產品添加發生之前越來越受限,因此在該負載上您無法看到新項目。
爲了防止重新添加項目後重新綁定中繼器。

+0

但該頁面重新加載回發。 Page_Load在SubmitListItem之後再次觸發。 – Wesley

+0

請在方法上附加一個調試器,它對您來說很清楚。 – justforkix09

+0

以下是方法/事件觸發的順序:在第一次加載時 - Init -Page_Load - PreRender - 渲染結束。當用戶點擊一個觸發後控制的控件時,序列是 - Init -Page_Load - 觸發回發的控件的事件處理程序 - PreRender - Render。因此,Page_Load(或者在webpart的情況下爲CreateChildControls)在事件處理器之前被回發。即使在回發期間,您也會看到http是無狀態協議,但在調用事件處理程序方法之前,必須在頁面加載中重新創建頁面控件。 – justforkix09

1

我認爲你應該這樣做只是如果不是爲網頁提交:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
     OfferID = Context.Request.QueryString["ItemID"]; 
     LoadOffers(); 
     } 
    } 
+0

解決了多次提交問題,但無助於顯示列表項。不過謝謝,如果沒有其他人發出響聲,我會標記它。 – Wesley

+0

對不起,我的壞,hoho永遠不會想到這一點,所以,如果你嘗試一個「location.reload」傳遞評論ID作爲URL參數的錨點,所以你的客戶可以得到它的評論顯示?一種方法來知道你是否應該做一個!Page.Postback將是檢查你的查詢字符串。讓我們找出答案。 – ricardordz

相關問題