Несколько групп переключателей в MVC 4 Razor

Мне нужно иметь несколько групп переключателей в моей форме, например:
введите здесь описание изображения

Я знаю, что это просто делается путем указания одного и того же html-атрибута "name" для каждой группы.
ОДНАКО
MVC не позволяет указать собственный атрибут name. при использовании помощника html следующим образом:

@Html.RadioButtonFor(i => item.id, item.SelectedID, new { Name = item.OptServiceCatId })  

Поскольку он просматривает атрибут "name" каждого тега (а не "id"), чтобы сопоставить/связать форму с моделью, которую получает контроллер. , и т.д.

Некоторые говорили, что указание каждого с одинаковым атрибутом «GroupName» решит проблему, но это тоже не сработало.

Итак, есть ли способ, который работает?

EDIT:
Вот мое мнение (упрощенное):

@model Service_Provider.ViewModels.SelectOptServicesForSubServiceViewModel

@foreach (var cat in Model.OptServices)
{
  //A piece of code & html here
  @foreach (var item in cat.OptItems.Where(i => i.MultiSelect == false))
  {
     @Html.RadioButtonFor(i => item.id, item.SelectedID, new { GroupName = item.OptServiceCatId })
<br />
  }    
}

ПРИМЕЧАНИЕ.
Моя модель List<OptServices>:

public List<OptServices> Cats {get; set;}

А внутри OptServices есть List из OptItems:

public class OptServices
{
//a few things
public List<OptItems> Items {get; set;}
}

person Ali    schedule 04.03.2014    source источник
comment
возможный дубликат как показать и использовать переключатель в Asp.Net MVC3   -  person bummi    schedule 13.09.2014


Ответы (5)


все, что вам нужно, это привязать группу к другому элементу вашей модели.

@Html.RadioButtonFor(x => x.Field1, "Milk")
@Html.RadioButtonFor(x => x.Field1, "Butter")

@Html.RadioButtonFor(x => x.Field2, "Water")
@Html.RadioButtonFor(x => x.Field2, "Beer")
person Matt Bodily    schedule 04.03.2014
comment
Да, но проблема в том, что радиостанции каждой группы создаются в foreach() в моем коде. - person Ali; 04.03.2014
comment
Можете ли вы показать свой foreach, и мы посмотрим, есть ли способ заставить его работать? - person Matt Bodily; 04.03.2014
comment
Конечно ! Я только что отредактировал свой пост. Пожалуйста, посмотрите. - person Ali; 04.03.2014
comment
см. здесь stackoverflow.com/questions/18040474/ и здесь stackoverflow.com/questions/7667495/mvc-radiobuttons-in-foreach - person Matt Bodily; 04.03.2014
comment
Большое спасибо, Мэтт Бодили! Ваши ссылки помогли мне решить эту проблему, хотя и по-другому. я ценю вашу помощь - person Ali; 04.03.2014
comment
Как это полезно? В моих тестах это не отображает метку для переключателей. Кроме того, он создает несколько переключателей с одинаковым идентификатором. - person Jonathan Wood; 01.01.2015
comment
@JonathanWood в этом примере нет меток. вам нужно будет добавить их. просто тег label. это создаст несколько переключателей с одним и тем же идентификатором. Тот, который будет нажат, установит значение, а переданное обратно значение переключателя будет тем, которое было выбрано (если щелкнуть первым, значением Field1 в обратном сообщении будет Молоко) - person Matt Bodily; 04.01.2015
comment
@MattBodily: Вы имели в виду тот же атрибут name? У них должно быть одно и то же имя, никогда не должно быть более одного элемента с одинаковым идентификатором. Во всяком случае, я только что нашел переключатели с ярлыками clickable, просто очень неудобными в MVC. Я исследовал это в течение нескольких дней и просто не нашел чистого решения. - person Jonathan Wood; 04.01.2015
comment
@JonathanWood, вы пробовали использовать помощник labelfor? Ты прав. он будет иметь то же имя и не должен иметь тот же идентификатор - person Matt Bodily; 04.01.2015
comment
@MattBodily: Да, и я могу заставить это работать. Но это требует нестандартного кодирования и имеет проблемы. Для получения дополнительной информации вы можете увидеть мой вопрос stackoverflow.com/questions/27727988/ - person Jonathan Wood; 04.01.2015
comment
Похожее решение может сработать. Вместо использования @Html.RadioButtonFor(x => x.Field1, Milk) и @Html.RadioButtonFor(x => x.Field2, Water) можно использовать старую версию помощника @Html в сочетании со счетчиком. Таким образом, вы можете использовать его в цикле. Например, @Html.RadioButton(Field+fieldCounter, Water) - person Mate Šimović; 29.01.2017

Хорошо, вот как я это исправил

Моя модель состоит из list категорий. Каждая категория содержит list своих подкатегорий.
Имея это в виду, каждый раз в цикле foreach каждая RadioButton будет иметь идентификатор своей категории (уникальный) в качестве имени< /em> атрибут.
И я также использовал Html.RadioButton вместо Html.RadioButtonFor.

Вот окончательный «рабочий» псевдокод:

@foreach (var cat in Model.Categories)
{
  //A piece of code & html here
  @foreach (var item in cat.SubCategories)
  {
     @Html.RadioButton(item.CategoryID.ToString(), item.ID)
  }    
}

Результат:

<input name="127" type="radio" value="110">

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

Спасибо всем, кто помог мне решить эту проблему ;)

person Ali    schedule 04.03.2014

Я исправил аналогичную проблему, создав RadioButtonFor с парами текст/значение из SelectList. Я использовал ViewBag для отправки SelectList в представление, но вы также можете использовать данные из модели. Мое веб-приложение — это блог, и мне нужно создать RadioButton с некоторыми типами статей, когда он пишет новый пост.

Код ниже был упрощен.

List<SelectListItem> items = new List<SelectListItem>();

Dictionary<string, string> dictionary = new Dictionary<string, string>();

dictionary.Add("Texto", "1");
dictionary.Add("Foto", "2");
dictionary.Add("Vídeo", "3");

foreach (KeyValuePair<string, string> pair in objBLL.GetTiposPost())
{
    items.Add(new SelectListItem() { Text = pair.Key, Value = pair.Value, Selected = false });
}

ViewBag.TiposPost = new SelectList(items, "Value", "Text");

В представлении я использовал foreach для создания радиокнопки.

<div class="form-group">
    <div class="col-sm-10">
        @foreach (var item in (SelectList)ViewBag.TiposPost)
        {
            @Html.RadioButtonFor(model => model.IDTipoPost, item.Value, false)
            <label class="control-label">@item.Text</label>
        }

    </div>
</div>

Обратите внимание, что я использовал RadioButtonFor, чтобы поймать параметр value, выбранный пользователем, в контроллере после отправки формы. Мне также пришлось поместить item.Text вне RadioButtonFor, чтобы отобразить параметры text.

Надеюсь, это полезно!

person Marcelo Sader    schedule 30.12.2014

Я смог использовать атрибут имени, который вы описали в своем примере, для цикла, над которым я работаю, и это сработало, возможно, потому, что я создал уникальные идентификаторы? Я все еще думаю, следует ли мне переключиться на шаблон редактора, как указано в ссылках в другом ответе.

    @Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "true", new {Name = item.Description.QuestionId, id = string.Format("CBY{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" }) Yes

    @Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "false", new { Name = item.Description.QuestionId, id = string.Format("CBN{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" } ) No
person Anna    schedule 11.07.2018

Вы можете использовать Dictionary для отображения. Предположим, что молоко, масло, сыры относятся к группе A (ListA), а вода, пиво, вино относятся к группе B.

Dictonary<string,List<string>>) dataMap;
dataMap.add("A",ListA);
dataMap.add("B",ListB);

В View вы можете foreach Keys в dataMap и обработать свое действие

person Dakota    schedule 04.03.2014
comment
Извините, я понятия не имею, как это сделать:/Есть ли какая-нибудь ссылка или пример, показывающий, как я могу это сделать? - person Ali; 04.03.2014