Dayan
Dayan

Reputation: 375

Passing selected value from the radio buttons to the controller in MVC

I'm trying to pass this selected radio button value from the razor view to the controller.... can someone please give me an idea how to do this?..................... My View looks like this:

@using (Html.BeginForm("Index", "Exam"))
{

    @Html.Hidden("qid", Model.ID, new { @id = "id" })
    <table>
        <tr>
            <td>
                @Model.ID
            </td>
            <td>
                @Model.QuestionDes
            </td>
        </tr>
        <tr>
            <td>
                <p>@Html.RadioButton("Answer1", new { @id = 1 })  @Model.Answer1 </p>
            </td>
        </tr>
        <tr>
            <td>
                <p>@Html.RadioButton("Answer2", new { @id = 2 })  @Model.Answer2 </p>
            </td>
        </tr>
        <tr>
            <td>
                <p>@Html.RadioButton("Answer3", new { @id = 3 })  @Model.Answer3 </p>
            </td>
        </tr>
        <tr>
            <td>
                <p>@Html.RadioButton("Answer4", new { @id = 4 })  @Model.Answer4 </p>
            </td>
        </tr>

    </table>

    <input type="submit" value="Next" />

}
@using (Html.BeginForm("PrevIndex", "Exam"))
{

    @Html.Hidden("qid1", Model.ID, new { @id = "id1" })
    <input value="Prev" type="submit" />
}

My Controller looks like this:.........

 public class ExamController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            IQuestionService ser = new QuestionService();
            QuestionLoadDTO q = ser.GetIndividualQuestions(1);
            return View(q);
        }

        [HttpPost]
        public ActionResult Index(QuestionLoadDTO ques)
        {
            int count = 0;
            count = int.Parse(Request["qid"].ToString());
            count++;
            if (count <= 4)
            {
                IQuestionService ser = new QuestionService();
                QuestionLoadDTO q = ser.GetIndividualQuestions(count);
                return View(q);
            }
            return RedirectToAction("Submit");

        }
        public ActionResult PrevIndex(QuestionLoadDTO ques)
        {
            int count1 = 0;
            count1 = int.Parse(Request["qid1"].ToString());
            count1--;
            if (count1 < 5 || count1 >= 0)
            {
                IQuestionService ser = new QuestionService();
                QuestionLoadDTO q = ser.GetIndividualQuestions(count1);
                return View("Index", q);
            }
            return RedirectToAction("End");

        }
        public ActionResult Submit()
        {
            return View();
        }
        public ActionResult End()
        {
            return View();
        }




    }

These are the other methods:

QuestionLoadDTO IQuestionService.GetIndividualQuestions(int index)
{
    IQuestionData ser = new QuestionRepository();           

    QuestionLoadDTO q = ser.GetIndividualQues(index);

    return q;
}
public QuestionLoadDTO GetIndividualQues(int index)
{
    Context con = new Context();
    Question question = con.Questions.Find(index);//Where(e => e.ID == index).FirstOrDefault();
    QuestionLoadDTO dto = new QuestionLoadDTO()
    {
        ID = question.ID,
        QuestionDes = question.QuestionDes,
        Answer1 = question.Answer1,
        Answer2 = question.Answer2,
        Answer3 = question.Answer3,
        Answer4 = question.Answer4

    };                                
    return dto;
}

Thank you!!!!

Upvotes: 12

Views: 92182

Answers (6)

Hai Dinh
Hai Dinh

Reputation: 1513

Add the following source code to View:

@Html.RadioButtonFor(m => m.Role, "1" ) <span>A</span>
@Html.RadioButtonFor(m => m.Role, "0" ) <span>B</span>
@Html.HiddenFor(m=>m.Role)

You can put the selected value to this HiddenField: @Html.HiddenFor(m=>m.Role) and send it to controller via [HttpPost] prototype.

Upvotes: 2

Alexie
Alexie

Reputation: 41

I saw this on another thread and it work like a champ.

Razor view like this:

@using (Html.BeginForm("test", "testcontroller"))
{
  @Html.RadioButton("CashPayment", "1")<span>Yes</span>
  @Html.RadioButton("CashPayment", "0")<span>No</span>
}

And Controller like this:

public ActionResult test(string CashPayment)
{   
   //your code
}

Upvotes: 3

Mahesh
Mahesh

Reputation: 567

Add property:

public string SelectedAnswer { get; set; }

Add in view:

@Html.RadioButtonFor(m => m.SelectedAnswer, "Answer1")
@Html.RadioButtonFor(m => m.SelectedAnswer, "Answer2")
@Html.RadioButtonFor(m => m.SelectedAnswer, "Answer3")
@Html.RadioButtonFor(m => m.SelectedAnswer, "Answer4")

In controller it postback the value according to selected radio button... i.e. either Answer1, or Answer2, etc.

Upvotes: 21

Balaji Selvarajan
Balaji Selvarajan

Reputation: 31

Use form collection

[HttpPost]
    public ActionResult Index(FormCollection fc)
    {

      string answerA = fc["Answer1"];
      string answerB = fc["Answer2"];
      string answerC = fc["Answer3"];
      string answerD = fc["Answer4"];
      return View();
    }

Upvotes: 3

Golda
Golda

Reputation: 3881

If you are giving same name for your radio buttons, then you can try the following code

Controller

[HttpPost]
public ActionResult Index(string Answer)
{
    return View();
}

View

@using (Html.BeginForm("Index", "Demo"))
{
       @Html.RadioButton("Answer", "A") <span>A</span> 
       @Html.RadioButton("Answer", "B") <span>B</span> 

    <input type="submit" value="Next" />
}

Upvotes: 8

Mairaj Ahmad
Mairaj Ahmad

Reputation: 14604

Either make a hidden field for every radio button or change you radio buttons like this

@Html.RadioButtonFor("Answer1", new { @id = 1 })

Upvotes: 3

Related Questions