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

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

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

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

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

Пожалуйста, направьте меня >>


person Paul    schedule 10.05.2012    source источник
comment
Является ли количество флажков динамическим (всегда ли будут одни и те же флажки, или это будет список флажков неизвестного размера?) Есть ли причина, по которой вам нужны идентификаторы, или будет достаточно логических значений, для которых флажки были отмечены? Пожалуйста, предоставьте код, который у вас есть сейчас.   -  person DMulligan    schedule 10.05.2012
comment
Добавлены коды. В конце частичного просмотра есть одна кнопка [[поиск]. Коды работают не так, как это может выглядеть.   -  person Paul    schedule 10.05.2012
comment
Вы готовы попробовать Ajax?   -  person COLD TOLD    schedule 10.05.2012


Ответы (2)


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

Я бы создал структуру модели представления, которая выглядела бы так:

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));
person DMulligan    schedule 10.05.2012
comment
Мы можем просто добавить только одно скрытое поле и, щелкнув каждый флажок, мы можем добавить идентификатор компании, который проверяется пользователем, и установить это значение в скрытом поле. - person alok_dida; 10.05.2012
comment
Не могли бы вы мне сказать почему? Это звучит как произвольное ограничение. - person DMulligan; 10.05.2012
comment
Всякий раз, когда он разделен запятыми, он отлично подходит для LINQ или SQL, когда мы хотим выполнять с ним какие-либо операции. - person alok_dida; 11.05.2012
comment
Методология, которую я дал вам, упрощает получение IEnumerable идентификаторов, которые уже готовы к LINQ. Отредактировал свой ответ, чтобы показать вам, как вы можете превратить эту строку linq в строку, разделенную запятыми. - person DMulligan; 11.05.2012
comment
Я хочу знать одну вещь. Что я получу в действии в моем методе публикации? - person alok_dida; 12.05.2012
comment
Вы имеете ввиду какой параметр будет принимать пост? Он должен принять вашу модель представления, которая будет автоматически привязана. - person DMulligan; 13.05.2012