2011-12-12 75 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

相关问题