ASP.NET MVC 3 с бритвой: Как передать идентификаторы выбранных флажков в частичном представлении действию контроллера?

У меня есть частичное представление [_SearchProduct] в основном представлении, скажем, в представлении [product]. Partialview имеет ряд флажков, разделенных на различные разделы, такие как поиск по компании, поиск по продукту и т. Д. С помощью одной кнопки [search].

Пользователь может установить несколько флажков. Когда пользователь нажимает кнопку [поиск], мне нужно передать идентификаторы всех выбранных флажков в действие контроллера и повторно выполнить рендеринг страницы, учитывая выбор пользователя. Пожалуйста, объясните мне, как передать выбранные идентификаторы флажков в действие моего контроллера.

Мой частичный вид выглядит примерно так:

<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>
  • флажки являются динамическими
  • Идентификатор флажка представляет основной ключ соответствующей таблицы, на основе которой я делаю фильтрацию.

Пожалуйста, ведите меня >>

2 ответа

Решение

Похоже, у вас есть структура, содержащая имена (компаний / продуктов) и идентификаторы.

Я хотел бы создать структуру 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), у вас будут списки компаний и продуктов. Вы можете пройтись по списку и взять соответствующие идентификаторы чего-либо проверенного для включения.

Изменить: Если вы хотите, чтобы один массив, разделенный запятыми, был размещен, это было бы возможно, если бы вы создали событие onclick для ваших флажков, а затем установили значение скрытого ввода при каждом нажатии флажка. Но тогда ваш код будет работать только с включенным JavaScript. Если вам нужна строка, разделенная запятыми, вы можете создать ее на стороне сервера с моделью представления, которую я предложил.

string companyIds = String.Join(",", model.Companies
    .Where(company => company.Include)
    .Select(company => company.Id));
Другие вопросы по тегам