在jQuery FaceBox中,如何处理asp.net按钮事件?

4

我正在使用jQuery FaceBox来显示文本框、下拉列表和按钮。用户可以在文本框中输入文本,在下拉列表中选择一个值,然后点击按钮。这会触发一些后端代码。FaceBox显示正常,其中的内容也没问题。而且,按钮事件也被触发了。这是按钮事件处理程序的代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        _favorit = new Favoritter();
        ListItem fav = ddl_favoritter.SelectedItem;
        _favorit.FavoritterFolderID = int.Parse(fav.Value);
        //_favorit.FavoritterFolderID = Convert.ToInt32(ddl_favoritter.SelectedItem);
        _favorit.FavoritterNavn = txt_favoritNavn.Text;
        _favorit.FavoritterUserID = UserID;
        _favorit.FavoritterUrl = HttpContext.Current.Request.Url.ToString();
        FavoritterManager.InsertFavoritter(_favorit);
    }

创建一个业务对象,并使用从控件中读取的值设置其属性。然后将该对象插入到数据库中,这个过程运行良好。问题在于文本框和下拉列表框的值没有正确设置。文本框的值为空,而ddl选择的值始终为1,即使在点击按钮之前我已经在文本框中写入了内容,并选择了另一个ddl项。ddl是这样加载的:

if (!Page.IsPostBack)
            {
                _favoritter = FavoritterFolderManager.GetFavoritterFolderByUser(UserID);
                ddl_favoritter.DataSource = _favoritter;
                ddl_favoritter.DataBind();

            }

我尝试将这段代码放在 if (!Page.IsPostBack) 之外,并且使用 objectdatasource 填充它,但仍然存在相同的问题。当我点击按钮时,就好像控件被“重置”了一样,而且我认为这与 FaceBox 没有任何关系,因为它只是显示包含控件的 div… 可能也有可能是 FaceBox 的问题… 有什么想法吗?

这是 aspx 页面中的代码:

<div id="showme" style="display:none;">
                        Add to favourites.<br />
                        <br />
                        <p>
                            Title:&nbsp;<span><asp:TextBox ID="txt_favoritNavn" runat="server"></asp:TextBox></span></p>
                        <p>
                            select folder:&nbsp;<span><asp:DropDownList ID="ddl_favoritter" runat="server" DataTextField="FavoritterFolderNavn"
                                DataValueField="FavoritterFolderID" AppendDataBoundItems="true">
                            </asp:DropDownList>
                            </span>
                        </p>
                        <br />
                        <asp:Button ID="Button1" runat="server" Text="Gem" onclick="Button1_Click"/>
                    </div>
3个回答

1

更改

$('body').append($.facebox.settings.faceboxHtml)

$('form').append($.facebox.settings.faceboxHtml)

1

您需要在if(!IsPostBack)块内填充文本框并选择下拉项的代码,因为页面加载事件在按钮事件之前再次触发(有关此信息,请参见ASP.NET页面生命周期)。您是否尝试在控件上启用视图状态?这可能是问题的一部分。


启用ViewState没有任何区别。我尝试将代码从按钮事件处理程序移动到if(!IsPostBack)块中,但结果是相同的。 - Soeren
你是否在文本框和下拉框本身上启用了视图状态? - Dan McClain

0

问题在于很多这些控件,不仅仅是FaceBox,默认情况下都会附加到body上。jQuery UI对话框也是如此。

查看此问题以获取解决方法:JQuery Facebox Plugin : Get it inside the form tag

当事情发生在<form>标签外部时,它们与ASP.Net的工作方式断开连接。当您单击提交时,那些输入框中的值不在表单内,因此不会提交到服务器...这就是为什么您没有看到这些值的原因。

这是该问题的快速答案,感谢Kevin Sheffield

在研究facebox.js时,我发现在函数init(settings)中有这一行...

$('body').append($.facebox.settings.faceboxHtml)

我把那个改成了...

$('#aspnetForm').append($.facebox.settings.faceboxHtml)

好的,这让我读取文本框中的值,但是下拉列表在回发时仍然更改为索引1,即使我在if(!Page.IsPostBack)中进行了数据绑定。此外,如果我在文本框中写入“hhhh”并点击保存按钮,则数据库中的值为“,hhhh”。由于某种原因,它在值前面放置了逗号... - Soeren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接