我正在使用 jquery.uix.multiselect。根据所选选项(付款类别),gridview 显示付款列表。
起初我在选择框上使用静态选项值:
<select id="multiselectbox" multiple="true" size="4"
class="ui-multiselect" runat="server">
<option value="11">Wine Expenses</option>
<option value="12">Subs Old</option>
<option value="13">Wine Receipts</option>
<option value="14">Bank Fees</option>
<option value="15">Bank Interest</option>
<option value="16">Honour Boards</option>
</select>
然后我在代码隐藏中获得了所选类别值的列表:
List<Int32> myIntList = new List<int>();;
for (int i = 0; i < multiselectbox.Items.Count; i++)
{
if (multiselectbox.Items[i].Selected)
{
CategoryIdList.Add(multiselectbox.Items[i].Value).Convert.ToInt32;
}
}
最后使用它为我的实体数据源创建一个 Where 字符串:
if (myIntList.Count() != 0)
{
string concatenatedIds = string.Join(",", myIntList.ToArray());
WhereClause = String.Format("{0} {1}{2}", "it.CategoryId IN {", concatenatedIds, "}");
}
EntityDataSource1Payments.WhereParameters.Clear();
EntityDataSource1Payments.AutoGenerateWhereClause = false;
EntityDataSource1Payments.Where = WhereString;
在我决定从数据库中填充选择框选项之前,一切都运行良好。
为此,我最终使用了一个 WebMethod,用 AJAX 调用它并成功,多选是用数据库中的值和名称对填充的。但是,这导致我的 PaymentCategory 过滤器停止工作。我发现原因是因为多选框现在填充了 javascript,服务器端代码不知道选择框中的内容,所以 multiselectbox.Items.Count 出现了“0”和 for 循环什么也没做。
因此,我决定必须使用 javascript 来获取 CategoryId 值。我能够很容易地获得多选中的值:
<script type="text/javascript">
function myButtonFunction() {
var selectedlist = $(".ui-multiselect").val();
alert(selectedlist);
var finalObject = JSON.stringify(selectedlist);
alert(finalObject);
$.ajax({
type: "post",
contenttype: "application/json; charset=utf-8",
url: "displaypayments.aspx/GetWhereString",
data: finalObject,
datatype: "json",
success: function () {
alert("seems to have gone okay"); },
error: function () { alert("error"); }
});
}
</script>
但是,尽管拥有正确的 CategoryId 值列表,但现在我不知道如何处理它们。
解决方案 1)首先我尝试将 Id 列表发送到上面的 WebMethod。但是我发现 WebMethod 必须是静态的,所以我也无法访问其中的 EntityDataSource。然后我尝试在后面的代码中创建一个函数来重置 Where 字符串,但我的 WebMethod 无法调用该函数(实例 - 再次出现静态问题)。通过进一步阅读,我发现一个 Web 服务可能是答案 - 但后来我陷入困境,认为我仍然必须使用它来重置 EntityDataSource,或者访问 gridview 以为其提供新的数据源,或者......
解决方案 2) 更改方法,现在使用 Javascript 更新实体数据源。但是,我无法弄清楚如何做到这一点。我不知道如何使用 JavaScript 访问实体数据源的 Where 属性。从阅读开始,它似乎使用 Java 访问控件,您需要访问 ClientIdMode 属性,以便您知道如何调用它 - 但是 EntityDataSource 没有 ClientIdMode ...。
解决方案 3)我还考虑回到填充选项的方式,并认为我可以在后面的代码中执行此操作 - 但似乎没有 ASP 选择框,它只有 HTML,所以如果我想使用可爱的 jquery - uix-multiselect 我必须用 javascript 填充它,不是吗???
所以我的问题主要是关于我的方法。我有 Ids 列表,我有一个函数可以创建一个很好的 whereclause 过滤器,但我不能把这两件事放在一起。我很高兴退后几步,改变我做任何事情的方式——我确信我处理这个难题的方式有些愚蠢。