我有一个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');\"" + "> </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个项目。
但该页面重新加载回发。 Page_Load在SubmitListItem之后再次触发。 – Wesley
请在方法上附加一个调试器,它对您来说很清楚。 – justforkix09
以下是方法/事件触发的顺序:在第一次加载时 - Init -Page_Load - PreRender - 渲染结束。当用户点击一个触发后控制的控件时,序列是 - Init -Page_Load - 触发回发的控件的事件处理程序 - PreRender - Render。因此,Page_Load(或者在webpart的情况下为CreateChildControls)在事件处理器之前被回发。即使在回发期间,您也会看到http是无状态协议,但在调用事件处理程序方法之前,必须在页面加载中重新创建页面控件。 – justforkix09