使用Request.Form确定在CheckBoxList中选择了哪些项目

时间:2016-06-07 22:09:56

标签: c# asp.net checkboxlist

使用问题here中显示的方法,我可以从CheckBoxList获取所选项目值:

var selectedCheckBoxItems = from key in Request.Form.AllKeys
                        where key.Contains(cbl.ID)
                        select Request.Form.Get(key);

然后我可以迭代结果:

foreach (var item in selectedCheckBoxItems)
{

}

问题是item只是发布的值,对于复选框,它只是字符串“on”。

on

我需要能够通过索引或其他方法确定哪个项目“开启”。

问题:如何使用CheckBoxList确定Request.Form中的哪些项目被选中?

这是我的CheckBoxList定义:

<asp:CheckBoxList runat="server" ID="cblAnimalType" SelectionMode="Multiple" DataTextField="OptionText" DataValueField="OptionId"  AutoPostBack="True"/>

项目从后面的代码添加到列表中:

DataTable dt = GetData(SqlGetListOptions, paramList);
cbl.DataSource = dt;
cbl.DataBind();

要知道的另一件重要事情是ViewStateMode="Disabled",因此我必须使用Request.Form来获取所选项目。

在回复评论时,以下是CheckBoxList的HTML呈现方式:

html

@Leopard指出他看到HTML中呈现的值在我的情况下没有发生。 AdamE对this question的回答解释了原因。我在web.config中有以下行:

<pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">

这解释了为什么我看到“on”而不是所选项目的实际值。我无法在没有验证它会破坏其他东西的情况下从web.config中提取兼容性,但是如果该设置可以安全删除,则可以从代码隐藏中访问复选框列表值。

4 个答案:

答案 0 :(得分:2)

通过在结果中添加键,我想到了一种方法。由于获取索引所需的字符串解析,我对此方法并不完全满意。也许其他人有更好的方法?

一般的想法是在结果中添加关键字:

var selectedCheckBoxItems = from key in Request.Form.AllKeys
                        where key.Contains(cbl.ID)
                        select new {Value = Request.Form.Get(key), Key = key};
foreach (var item in selectedCheckBoxItems)
{
   var val = item.Value;
   var key = item.Key;
}

然后我可以解析密钥以找到索引,这是我设置所选选项所需要的:

var selectedCheckBoxItems = from key in Request.Form.AllKeys
                        where key.Contains(cbl.ID)
                        select new {Value = Request.Form.Get(key), Key = key};

string[] stringParse = new string[] {listName.Replace(" ", "") + '$'};

foreach (var item in selectedCheckBoxItems)
{
    var val = item.Value;
    var key = item.Key;
    var idxArray = key.Split(stringParse, StringSplitOptions.None);
    var idxString = idxArray[idxArray.Length - 1];
    int idxInt;
    if (Int32.TryParse(idxString, out idxInt))
    {
        cbl.Items[idxInt].Selected = true;
    }
}

答案 1 :(得分:2)

当您绑定来自checkboxList DatabaseOptionId的{​​{1}}时,您可以检查选择了哪个checkboxes并将其值存储在List<int>中,并假设其价值是int

然后,当您填充checkboxlist时,您可以检查之前存储的value中存在的listvalue基于select您可checkbox相关的List<int> SelectedCheckBoxes = new List<int>(); var selectedCheckBoxItems = from key in Request.Form.AllKeys where key.Contains(cblAnimalType.ID) select Request.Form.Get(key); foreach (var item in selectedCheckBoxItems) { SelectedCheckBoxes.Add(int.Parse(item.ToString())); }

以下是示例代码

populate

然后当您checkboxlist value时,您可以foreach (ListItem listItem in cblAnimalType.Items) { if (SelectedCheckBoxes.Contains((int.Parse(listItem.Value)))) { listItem.Selected = true; } } 找到项目并选择它们

SelectedCheckBoxes List

您可能需要将session存储在checkboxlist中,具体取决于您填充Asp.net 4.0的方式。

<强>更新

根据您的讨论,您使用的是checkboxes,但您的value attribute没有controlRenderingCompatibilityVersion="3.5"本应该存在的Asp.Net 4.0

这种情况正在发生,因为您使用的web.congif已不再需要,因为您已经在使用value of checkbox

因此,从on删除此行会解决问题,您将能够获得<pages controlRenderingCompatibilityVersion="3.5" /> 而不只是获取def create respond_to do |format| @targetrecord = TargetRecord.new(targetrecord_params) @targetrecord.save if @targetrecord.save format.json{ render :json => @targetrecord.to_json ,status: 200 } else format.json { render json: @targetrecord.errors, status: 404 } end end end end def targetrecord_params params.require(:targetrecord).permit(:id, :uuid, :manor, :mac, :beacon_type, :longitude, :latitude, :address, :findTime, :rssi, :finderID, :created_at, :updated_at ) end

"targetrecord":

{"id":"","name":"",.....}

答案 2 :(得分:1)

这是解析密钥以获取所选索引的另一种方法。它还使用UniqueID属性来查找相关键。

var selectedCheckBoxItems = from key in Request.Form.AllKeys
                            where key.Contains(cblAnimalType.UniqueID)
                            select new { Value = Request.Form.Get(key), Key = key };

foreach (var item in selectedCheckBoxItems)
{
    var val = item.Value;
    string indexToken = item.Key.Replace(cblAnimalType.UniqueID, "");
    int index = int.Parse(Regex.Replace(indexToken, @"[^\d]", ""));
    ...
}

答案 3 :(得分:0)

我意识到这与之前的回复非常接近,所以我不确定它是否添加任何东西,但它更简洁,所以我会添加它。在Request.Form.AllKeys中,Key是复选框的html名称。复选框的html名称包含索引。我只想改变你的linq查询,只选择&#34; on&#34;然后返回键列表。之后,您只需解析密钥即可获得索引。

var selectedCheckBoxItems = from key in Request.Form.AllKeys
                            where key.Contains(cbl.ID) && Request.Form.Get(key) == "on"
                            select key;

foreach (var item in selectedCheckBoxItems)
{
     var index = 0;
     if (int.TryParse(item.Substring(item.LastIndexOf("$") + 1), out index))
     {
         //do what you will
     } 
}

此外,此实例中的字符串解析非常安全,因为字段名称是由框架以非常具体和公式化的方式生成的。它们之间存在差异的可能性接近甚至为零。