【问题标题】:ASP.NET MVC 3 WITH RAZOR : How to pass selected checkbox' ids in a Partial view to controller action?带有 RAZOR 的 ASP.NET MVC 3:如何将部分视图中选定的复选框 id 传递给控制器​​操作?
【发布时间】:2012-05-18 14:16:33
【问题描述】:

我在主视图中有一个局部视图 [_SearchProduct],比如说 [product] 视图。 Partialview 有许多复选框,分为不同的部分,例如按公司搜索、按产品搜索等,只需一个 [搜索] 按钮。

一个用户可以选择多个复选框。当用户单击 [搜索] 按钮 我需要将所有选中复选框的 id 传递给控制器​​操作 并考虑用户的选择再次重新呈现页面。请指导我如何将选定的复选框 ID 传递给我的控制器操作。

我的部分观点如下:

<fieldset>
<legend>By Company</legend>
<table  style="border-style: none;">
   <tr>
        @{
            int i = 0;
            foreach (var item in Model.CompanyName)
            {

                i = i + 1;
            <td style="border-style: none;text-decoration:none;" >
                @Html.CheckBox("chkCompany",new {id="chkCompany_" + Model.CompanyId.Tostring()}) @Model.CompanyName
            </td>
                if (i == 5)
                {
                    @:</tr><tr>
                    i = 0;
                }

            }
        }
    </tr>
</table>
</fieldset>

<fieldset>
<legend>By Product</legend>
<table  style="border-style: none;">
    <tr>
        @{
             i = 0;
            foreach (var item in Model.Product)
            {
                i = i + 1;
            <td style="border-style: none;text-decoration:none;" >
                @Html.CheckBox("chkProduct",new {id="chkProduct_" + Model.CompanyId.Tostring()}) @Model.ProductName
            </td>
                if (i == 10)
                {
                    @:</tr><tr>
                    i = 0;
                }

            }
        }
    </tr>
</table>
</fieldset>
  • 复选框是动态的
  • 复选框 id 代表我进行过滤的各个表的主键。

请指导我>>

【问题讨论】:

  • 复选框的数量是动态的(总是有相同的复选框,还是会是一个未知大小的复选框列表?)您是否需要 id 或布尔值哪些复选框被选中了?请提供您现在拥有的代码。
  • 添加了代码。在局部视图的末尾,它有一个 [[search] 按钮。代码并不像看起来那样工作。
  • 你愿意尝试ajax吗

标签: asp.net-mvc-3 razor partial-views data-sharing


【解决方案1】:

所以听起来你有一个包含(公司/产品的)名称和 ID 的结构。

我会创建一个看起来像这样的视图模型结构

public class PartialViewModel //Make sure this is included in your main view model
{
    public List<ObjectsToInclude> Companies { get; set; }
    public List<ObjectsToInclude> Products { get; set; }
}

public class ObjectsToInclude //Give this a better name
{
    public string Name { get; set; }
    public string Id { get; set; }
    public bool Include { get; set; }
}

然后为了绑定它们,你可以这样做

for (int i =0; i<Model.Companies.Count(); i++)
{
   <td style="border-style: none;text-decoration:none;" >
            @Html.HiddenFor(m => m.Companies[i].Id)
            @Html.CheckBoxFor(m => m.Companies[i].Include) @Model.Companies[i].Name
   </td>
   if (i == 5)
   {
       @:</tr><tr>
       i = 0;
   }

}

然后,如果您的帖子采用PartialViewModel 参数(或某些MainViewModel,其中包含PartialViewModel 的实例),您将拥有绑定的公司和产品列表。您可以遍历该列表,并获取所有被检查内容的相应 ID。

编辑:如果您想发布一个逗号分隔的数组,可以通过为您的复选框创建一个 onclick 事件,然后每次设置一个隐藏输入的值复选框被点击。但是你的代码只能在启用 JavaScript 的情况下工作。如果你需要一个逗号分隔的字符串,你可以使用我建议的视图模型在服务器端创建它。

string companyIds = String.Join(",", model.Companies
    .Where(company => company.Include)
    .Select(company => company.Id));

【讨论】:

  • 我们可以简单地只添加一个隐藏字段,点击每个复选框,我们可以附加用户检查的公司 ID,并在隐藏字段中设置该值。
  • 你能告诉我为什么吗?这听起来像是一种武断的限制。
  • 无论何时用逗号分隔,当我们想用它做任何操作时,它在 LINQ 或 SQL 上都会很棒。
  • 我给你的方法可以很容易地获得 Ids 的 IEnumerable,它已经准备好 LINQ。编辑了我的答案,向您展示如何将此 linq 字符串转换为逗号分隔的字符串。
  • 我想知道一件事。我将在我的 post 方法中获得什么行动方法?
【解决方案2】:
猜你喜欢
  • 2017-06-06
  • 2012-12-31
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多