ASP.NET MVC 3 WITH RAZOR:如何将部分视图中选定的复选框'id传递给控制器​​操作?

时间:2012-05-10 02:16:22

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

我在主视图中有一个partialview [_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代表相应表的主键,基于我的过滤。

请指导我&gt;&gt;

2 个答案:

答案 0 :(得分:1)

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

我会创建一个看起来像

的View Model结构
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));

答案 1 :(得分:0)