how do i pass values from foreach so as to create a new list of model?

2.4k Views Asked by At
@model IEnumerable<OnlineExam.Models.CandidateExam.CandidateExam>


@{
    ViewData["Title"] = "Index";
    var questionList = JsonConvert.DeserializeObject<List<OnlineExam.Models.AdminQuestionModel.QuestionAndAnswers>>(TempData["questionList"].ToString());
    var data = questionList as IEnumerable<OnlineExam.Models.AdminQuestionModel.QuestionAndAnswers>;
    TempData.Keep();

}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
@{
    int count = 0;
}
@foreach (var item2 in Model)
{
    @foreach (var item in data)
    {
        count = count + 1;
        <table class="table" style="background-color:lavender">
            <tbody>
                <tr class="border-light"><td>Question @count :   @item.Question</td></tr>
                <tr class="bg-light"><td>Options : </td></tr>
                <tr class="border-light"><td><input asp-for="@item2.OptionSelected" type="radio" name="counter" value="@item.OptionTwo" /> a) @item.OptionOne</td></tr>
                <tr class="bg-light"><td><input asp-for="@item2.OptionSelected" type="radio" name="counter" value="@item.OptionTwo" /> b) @item.OptionTwo</td></tr>
                <tr class="border-light"><td><input asp-for="@item2.OptionSelected" type="radio" name="counter" value="@item.OptionThree" /> c) @item.OptionThree</td></tr>
                <tr class="bg-light"><td><input asp-for="@item2.OptionSelected" type="radio" name="counter" value="@item.OptionFour" /> d) @item.OptionFour</td></tr>

            </tbody>
        </table>
        <br />
    }
}
<div class="form-group">
    <input type="submit" value="Submit" class="btn btn-primary" />
</div>

.................................................................................................
Basically i want to load data from item to item 2 ie: I want to supply values from one foreach to model(IEnumerable). How do i do tht?

3

There are 3 best solutions below

0
Waheed Asghar On

You cannot bind the foreach item with the posted back items because it messes up the naming convention MVC relies on to post the data back. You will have to use For loop for this purpose.

    @for(int i=0; i< Model.Count(); i++)
{
for (int j=0; i< data.Count(); j++)
{
  // here you can do like this to bind your element 
@Html.RadioButtonFor(x=> data[j].propertyName)

   }
}
0
Rena On

Here is a working demo:

1.Model:

public class CandidateExam
{
    public int Id { get; set; }
    public string OptionSelected { get; set; }
}
public class QuestionAndAnswers
{
    public int Id { get; set; }
    public string Question { get; set; }
    public string OptionOne { get; set; }
    public string OptionTwo { get; set; }
    public string OptionThree { get; set; }
    public string OptionFour { get; set; }
}

2.View(Note that you set the optionOne with wrong value @item.OptionTwo):

@model IEnumerable<QuestionAndAnswers>

@{
    int count = 0;
    int i = 0;
}
<form method="post">
    @foreach (var item in Model)
    {
        count = count + 1;
        <table class="table" style="background-color:lavender">
            <tbody>
                <tr class="border-light"><td>Question @count :   @item.Question</td></tr>              
                <tr class="bg-light"><td>Options : </td></tr>
                <tr class="border-light"><td><input asp-for="@item.OptionOne" type="radio" name="counter[@i]" value="@item.OptionOne" /> a) @item.OptionOne</td></tr>
                <tr class="bg-light"><td><input asp-for="@item.OptionTwo" type="radio" name="counter[@i]" value="@item.OptionTwo" /> b) @item.OptionTwo</td></tr>
                <tr class="border-light"><td><input asp-for="@item.OptionThree" type="radio" name="counter[@i]" value="@item.OptionThree" /> c) @item.OptionThree</td></tr>
                <tr class="bg-light"><td><input asp-for="@item.OptionFour" type="radio" name="counter[@i]" value="@item.OptionFour" /> d) @item.OptionFour</td></tr>
            </tbody>
        </table>
        i++;
        <br />

    }
    <div class="form-group">
        <input type="submit" value="Submit" class="btn btn-primary" />
    </div>
</form>

3.Controller:

public class QuestionAndAnswersController : Controller
{
    private readonly YourContext _context;
    public QuestionAndAnswersController(YourContext context)
    {
        _context = context;
    }
    // GET: QuestionAndAnswers
    public async Task<IActionResult> Index()
    {
        return View(await _context.QuestionAndAnswers.ToListAsync());
    }
    [HttpPost]
    public async Task<IActionResult> Index(string[] counter)
    {
        foreach(var item in counter)
        {
            var data = new CandidateExam()
            {
                OptionSelected = item
            };
            _context.Add(data);
            await _context.SaveChangesAsync();
        }
        //do your stuff...
    }

4.Result: enter image description here

0
Vikas On
@model OnlineExam.Models.CandidateExam.CandidateItem
@{
    ViewData["Title"] = "Index";
    var questionList = JsonConvert.DeserializeObject<List<OnlineExam.Models.AdminQuestionModel.QuestionAndAnswers>>(TempData["questionList"].ToString());
    //var data = questionList as IEnumerable<OnlineExam.Models.AdminQuestionModel.QuestionAndAnswers>;
    var data2 = questionList as List<OnlineExam.Models.AdminQuestionModel.QuestionAndAnswers>; //new stackov
    int examAttemptId = Convert.ToInt32(TempData["examAttemptId"].ToString());
    TempData.Keep();

}

<h1>Index</h1>

    <p>
        <a asp-action="Create">Create New</a>
    </p>
    <div>
        <form enctype="multipart/form-data" asp-action="AnswerExam">

            @{
                int counter = 0;
            }
            @for (var i = 0; i < data2.Count(); i++)
            {
                counter = counter + 1;
                <input type="hidden" asp-for="candidateExamsList[i].ExamId" value="@data2[i].ExamId" />
                <input type="hidden" asp-for="candidateExamsList[i].QuestionId" value="@data2[i].QuestionId" />
                <input type="hidden" asp-for="candidateExamsList[i].ExamAttemptId" value="@examAttemptId" />
                <span>Question @counter) </span>@data2[i].Question.ToString()<br />
                <span>Options : </span><br />
                <span>a) </span>@Html.RadioButtonFor(x => x.candidateExamsList[i].OptionSelected, data2[i].OptionOne) @data2[i].OptionOne;<br />
                <span>b) </span>@Html.RadioButtonFor(x => x.candidateExamsList[i].OptionSelected, data2[i].OptionTwo) @data2[i].OptionTwo;<br />
                <span>c) </span>@Html.RadioButtonFor(x => x.candidateExamsList[i].OptionSelected, data2[i].OptionThree) @data2[i].OptionThree;<br />
                <span>d) </span>@Html.RadioButtonFor(x => x.candidateExamsList[i].OptionSelected, data2[i].OptionFour) @data2[i].OptionFour;<br /><br />
            }

            <div class="form-group">
                <button type="submit" value="Submit" class="btn btn btn-primary" />
            </div>
        </form>
        </div>

This is how i cud fix my issue..i used a for loop instead of foreach loop to bind data from the list to the model.