2016-04-08 4 views
-1

У меня есть опрос с 6 вопросами. Каждый вопрос будет оцениваться между (1-5). Я хочу зафиксировать значение, выбранное для каждого вопроса. Только одно значение может быть выбрано по каждому вопросу. . Ниже приведено несколько вариантов для каждого вопроса, поэтому я должен ограничиться выбором только одного для каждого вопроса. Все переключатели должны быть сгруппированы как одна, и можно выбрать только одну кнопку. Я должен уметь отображать выбранное значение для каждого при его представлении.позволяют выбрать только одну радиообъектуру

public class SurveyViewModel 
{ 
    public GroupViewModel GroupA { get; set; } 
    public GroupViewModel GroupB { get; set; } 
    public GroupViewModel GroupC { get; set; } 
    public SurveyViewModel() 
    { 
     GroupA = new GroupViewModel(); 
     GroupA.GroupName = "A"; 
     GroupB = new GroupViewModel(); 
     GroupB.GroupName = "B"; 
     GroupC = new GroupViewModel(); 
     GroupC.GroupName = "C"; 
    } 
} 

public class GroupViewModel 
{ 
    public string GroupName { get; set; } 
    public bool radio1 { get; set; } 
    public bool radio2 { get; set; } 
    public bool radio3 { get; set; } 
    public bool radio4 { get; set; } 
    public bool radio5 { get; set; } 
} 

Редактор шаблона:

<div> 
    <h4>GroupViewModel</h4> 
    <hr /> 
    <dl class="dl-horizontal"> 
     <dt>@Html.RadioButtonFor(model => model.radio1, true, new { id = Model.GroupName + "1" })</dt> 
     <dd>@Html.DisplayNameFor(model => model.radio1)</dd> 
     <dt>@Html.RadioButtonFor(model => model.radio2, true, new { id = Model.GroupName + "2" })</dt> 
     <dd>@Html.DisplayNameFor(model => model.radio2)</dd> 
     <dt>@Html.RadioButtonFor(model => model.radio3, true, new { id = Model.GroupName + "3" })</dt> 
     <dd>@Html.DisplayNameFor(model => model.radio3)</dd> 
     <dt>@Html.RadioButtonFor(model => model.radio4, true, new { id = Model.GroupName + "4" })</dt> 
     <dd>@Html.DisplayNameFor(model => model.radio4)</dd> 
     <dt>@Html.RadioButtonFor(model => model.radio5, true, new { id = Model.GroupName + "5" })</dt> 
     <dd>@Html.DisplayNameFor(model => model.radio5)</dd> 
    </dl> 
</div> 

и обзор Вид следующим образом:

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m.GroupA) 
    @Html.EditorFor(m => m.GroupB) 
    @Html.EditorFor(m => m.GroupC) 
    <input type="submit" value="Continue" /> 
} 

Я добавил имя группы, как размещены ниже, но я не мог в состоянии захватить выбранный значение в сообщении http

@Html.RadioButtonFor(model => model.radio1, true, new { id = Model.GroupName + "1", @Name = Model.GroupName }) 
+0

Вы можете разместить сгенерированный HTML для представления обследования? – Kypaz

+0

Благодарим вас за ответ. Он отлично работал. Как проверить, чтобы заставить пользователя выбрать один ответ для каждого вопроса. Значение по умолчанию для рейтинга равно 0, я не могу использовать атрибут Required, так как не будет значений с нулевым значением.Должен ли я изменить значение свойства int как nullable (int?). Если я изменю его на nullable, тогда мне придется внести поправки в много изменений. Есть ли способ, который мы можем проверить с помощью существующего свойства? – Rama

ответ

0

Вы должны переопределить атрибут имя:

@Html.RadioButtonFor(model => model.radio1, true, new { id = Model.GroupName + "1", @Name = "Group" }) 

Вы должны сделать это для каждого радиокнопки, что вы хотите иметь только один выбор.

При использовании Html.RadioButtonFor он ожидал, что вы используете один и тот же свойство связывать все радиокнопки, как:

@Html.RadioButtonFor(model => model.radio, "answer1") 
@Html.RadioButtonFor(model => model.radio, "answer2") 
@Html.RadioButtonFor(model => model.radio, "answer3") 

Или используя Перечень вместо «answer1», «ANSWER2» и «Ответ3»

+0

Я изменил его на @ Html.RadioButtonFor (model => model.radio1, true, new {id = Model.GroupName + "1", @Name = Model.GroupName}), что позволило мне захватить один переключатель для каждого вопроса, но выбранные значения не записываются в сообщении http. – Rama

+0

@Rama Значения были пустыми? Раньше был захвачен? – Henrique

0

Каждый переключатель, который вы генерируете, если для другого свойства и имеет другое имя (они не сгруппированы), поэтому все переключатели в пределах «Вопроса» могут быть выбраны, и, что еще хуже, ни один из них не может быть отменен после выбора.

Кроме того, ваши свойства в пределах SurveyViewModel являются одинаковыми, поэтому вы должны использовать свойство коллекции, а не создавать индивидуальные свойства для каждого элемента.

Начните с создания модели представления, которая представляет то, что вы хотите отображать/редактировать в представлении.

public class QuestionVM 
{ 
    public string Name { get; set; } 
    [Required(ErrorMesage = "Please select a rating")] 
    public int? Rating { get; set; } 
} 

и в методе контроллера GET

List<QuestionVM> model = new List<QuestionVM>() 
{ 
    new QuestionVM() { Name = "A" }, 
    new QuestionVM() { Name = "B" }, 
    new QuestionVM() { Name = "C", Rating = 3 } // use this if you want to pre-select a radio button 
}; 
return View(model); 

Далее, создать EditorTemplate для QuestionVM. Шаблоны должны быть названы /Views/Shared/EditorTemplates/QuestionVM.cshtml

@model QuestionVM 
<div class="question"> 
    @Html.HiddenFor(m => m.Name) // so this value posts back 
    <h2>@Model.Name</h2> 
    @for(int i = 1; i < 6; i++) 
    { 
     <label> 
      @Html.RadioButtonFor(m => m.Rating, i, new { id = "" })// remove id attribute to prevent invalid html 
      <span>@i</span> 
     </label> 
    } 
    @Html.ValidationMessageFor(m => m.Rating) 
</div> 

и, наконец, в главном окне

@model IEnumerable<QuestionVM> 
@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m) 
    <input type="submit" value="Save" /> 
} 

, который будет размещать назад

public ActionResult Edit(IEnumerable<QuestionVM model) // adjust method name to suit 
Смежные вопросы