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));