所以我们走了。我在“客户”记录中有两个下拉列表。第一个叫做“商店”。第二个叫做“StoreWarehouse”。当用户选择“存储”值时,根据其选择过滤“StoreWarehouse”下拉列表。我通过jQuery和AJAX完成了过滤。我使用的是ListView,它位于InsertItemTemplate。
以下是代码:
function StoreWarehouseLoad(store_ddl) {
var store_id = store_ddl.options[store_ddl.selectedIndex].value;
var js = JSON.stringify({ store: store_id });
$.ajax({
url: baseUrl + '/AutoComplete/StoreList.asmx/GetStores',
data: js,
dataType: "json",
type: "POST",
contentType: "application/json; charset=utf-8",
success: function (data) {
var ddl = $("#StoreWarehouse_ddl");
ddl.find('option').remove();
$(data.d).each(function (index) {
ddl.append('<option value="' + this.WarehouseID + '">' + this.WarehouseID + '</option>');
});
switch (culture) {
case "en-CA":
ddl.val(store_id.substring(0, 2) + "I");
break;
case "en-US":
ddl.val('001');
break;
default:
alert("The default warehouse cannot be set because there's something wrong with the current culture...");
break;
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
sendErrorEmail(window.location.href, 'Customers.aspx.StoreWarehouseLoad', XMLHttpRequest);
}
});
}
此JavaScript调用一个Web服务,该服务根据“Store”下拉列表中选择的选项加载“StoreWarehouse”下拉列表。这一切都非常有效。
我的问题是我保存记录的时间。假设我将为客户输入新记录,输入所有值(以及Store和StoreWarehouse下拉列表)。我将点击“保存” - 然后应该将数据保存到数据库。我的问题是来自StoreWarehouse下拉列表的SelectedValue没有进入业务层。我甚至为ListView的“OnInserting”事件捕获了e.Values,e.Values [“DefaultWarehouseId”]为空。这是两个下拉列表的aspx页面:
<div class="labelAndTextboxContainer">
<div class="labelContainer">
<asp:Label CssClass="rightFloat" ID="StoreId_lbl" runat="server" Text="Branch:"></asp:Label><br />
</div>
<div class="textboxContainer">
<asp:DropDownList ID="Store_ddl" runat="server" DataSourceID="StoreDataSource" AppendDataBoundItems="true"
onchange="StoreWarehouseLoad(this);" DataValueField="StoreID" DataTextField="StoreID"
CssClass="leftFloat" Font-Size="Smaller" SelectedValue='<%# Bind("StoreID") %>'>
<asp:ListItem />
</asp:DropDownList>
<asp:RequiredFieldValidator ID="StoreId_ddl_rfv" runat="server" ControlToValidate="Store_ddl"
Text="*" ForeColor="Red" />
</div>
</div>
<br class="clear" />
<div class="labelAndTextboxContainer">
<div class="labelContainer">
<asp:Label CssClass="rightFloat" ID="StoreWarehouse_lbl" runat="server" Text="Def. Store Warehouse:"></asp:Label><br />
</div>
<div class="textboxContainer">
<asp:DropDownList ID="StoreWarehouse_ddl" runat="server" CssClass="leftFloat" Font-Size="Smaller"
OnDataBound="StoreWarehouse_ddl_OnDataBound" onchange="changeWarehouse();" SelectedValue='<%# Bind("DefaultWarehouseId") %>'
ClientIDMode="Static">
</asp:DropDownList>
</div>
</div>
如您所见,我在StoreWarehouse下拉列表中将“SelectedValue”设置为&lt;%#Bind(“DefaultwarehouseId”)%&gt;。 DefaultWarehouseId由于某种原因没有在StoreWarehouse的下拉列表中获取值。
有趣的是,我可以将以下内容放入上面显示的JavaScript中,并提醒我该下拉列表的选定值:
alert("store warehouse selected is " + $("#StoreWarehouse_ddl").val());
为什么服务器端代码没有获取此值?
非常感谢!
麦克
答案 0 :(得分:2)
就像@ shiznit123所说的那样,这些信息存储在ControlState中。我更喜欢MVC框架而不是WebForms的原因之一。
但是,在您的情况下,我相信您可以使用隐藏字段解决此问题。 asp:hidden
。您只需要直接管理该值。因此,当用户选择下拉列表中的项目时,更新相应的隐藏字段。
答案 1 :(得分:0)
我怀疑问题是因为您正在填充DropDownList控件客户端。当您回发服务器端时,忽略您生成的javascript项,因为它会根据隐藏的ControlState重建控件。
如果你想在WebForms中使用ajax进行此类操作,我会查看提供的ajax控件,并使用更新面板。