2016-04-28 12 views
-1

Мне нужно создать несколько групп из RadioButton s в моем опросе. Для того, чтобы они были в отдельных группах, я создаю имя во время выполнения инструкции foreach. Все имеют одно и то же название. Там мой кодКак принять список аргументов с не статическими именами anp.net.mvc-5 C#

@foreach (var answer in Model.PossibleAnswers) 
{ 
    <div class="col-xs-2"> 
    @Html.RadioButtonMatrix(answer.IdAspect.ToString(), answer.IdAspect) 
    </div> 
} 

И есть мой метод обычая Html Helper

public static HtmlString RadioButtonMatrix(this HtmlHelper helper, 
              string target, 
              int value) 
{ 
    StringBuilder sb = new StringBuilder("SelectedValue."); 
    sb.Append(target); 

    string radioButton = 
     String.Format("<input name=\"" + sb + "\" type=\"radio\" value=\"{0}\"/>", value); 

    return new HtmlString(radioButton); 
} 

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

[HttpPost] 
public void GetAnswersMatrix([Bind(Prefix="SelectedValue")]List<String> selectedValues) 
{ 
} 

Спасибо за вашу помощь!

+0

Ваша общая конечная цель и рассуждения немного неясны, но если бы я был вами, я бы, скорее всего, обернул коллекцию «RadioButton» в новый объект класса, называемый «RadioButtonGroup», после чего вы можете дать ему свойство name, и это сделает ваша структура данных намного проще для менеджера и итерации. Особенно, если 'Group' на самом деле просто обертывает один вопрос и возможные ответы, объект класса сделает этот MUCH чище и проще кодировать. – Wobbles

+0

Я также вижу небольшую точку в '[Bind (Prefix =" SelectedValue ")]' вам нужно только привязать, если у вас есть объект, у которого есть свойства, которые вы хотите, чтобы привязка модели намеренно игнорировала. Поскольку у вас есть только 1 объект, вы всегда будете привязываться к нему. –

+0

@ Wobbles У меня есть такая «группа» - «SomeAnswer». Это модель для первого продемонстрированного представления. У него есть 'IdAspect' и' List '. Но как это помогает мне создавать разные группы «RadioButtons» и отправлять 'selectedValues' в виде коллекции для контроллера? –

ответ

1

Я предлагаю следующую структуру данных, чтобы помочь вам немного больше:

class QuizModel 
{ 
    public string HowMuchDoYouLikeCSharp {get;set;} 
    public string HowMuchDoYouLikeCPlusPlus {get;set;} 
} 

public class QuizQuestion 
{ 
    public string Question { get; set; } 
    public string QuestionModelProp {get;set;} //This must match a prop name in the QuizModel 
    public List<string> PossibleAnswers { get; set; } 

    public string generateHTML() 
    { 
     StringBuilder ret = new StringBuilder(); 
     ret.Append("<div>"+Question+"</div>"); 
     foreach (string answer in PossibleAnswers) 
     { 
      ret.Append(String.Format(@"<input name='{0}' type='radio' value='{1}'/>{1}<br/>", QuestionModelProp, answer)); 
     } 

     return ret.ToString(); 
    } 
} 

[HttpPost] 
public ActionResult SubmitAction(QuizModel quizData) 
{  
    string HowMuchDoYouLikeCSharp = quizData.HowMuchDoYouLikeCSharp; 
    string HowMuchDoYouLikeCPlusPlus = quizData.HowMuchDoYouLikeCPlusPlus; 
} 

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

Обратите внимание, что поскольку вопрос и ответы находятся в одном классе, легко создать радиогруппу на основе вопроса об итерации ответа.

EDIT: Изменен код, который будет ближе к вашим потребностям, а также модель в качестве примера.

+0

Спасибо за совет, но я до сих пор не понимаю, как вы получите правильные ответы (выбранный «RadioButton's») в вашем контроллере? Не могли бы вы показать его? У меня проблема, потому что имена «RadioButtons» - это не то же самое, что я вижу. –

+0

Строка данных, которую вы получаете в сообщении, должна быть '? Question1 = Answer1 & Question2 = Answer2' С« QuestionN »и« AnswerN », являющимися фактической строкой Q и A. Поэтому вам нужно только убедиться, что ваша модель содержит эти свойства: 'var answerOne = Request [" Question1 "];' – Wobbles

+0

Если вы не используете сильно типизированную или определенную модель и хотите, чтобы она была более гибкой, вам может потребоваться за пределами норм MVC и собирать ваши данные в словаре, итерации поддержки 'Request' на обработчике' HttpPost'. – Wobbles