как передать значения из foreach, чтобы создать новый список моделей? - PullRequest
0 голосов
/ 04 февраля 2020
@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>

............................................ .................................................. ...
В основном я хочу загрузить данные из элемента в элемент 2 ie: я хочу предоставить значения из одного foreach в модель (IEnumerable). Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Вот рабочая демонстрация:

1.Модель:

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.Просмотр (Обратите внимание, что вы установили optionOne с неправильным значением @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. Контроллер:

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.Результат: enter image description here

1 голос
/ 04 февраля 2020

Вы не можете связать элемент foreach с опубликованными задними элементами, потому что он нарушает соглашение об именах MVC полагается, чтобы отправить данные обратно. Для этого вам придется использовать For l oop.

    @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 голосов
/ 05 февраля 2020
@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>

Вот так я могу решить мою проблему ... я использовал a для l oop вместо foreach l oop, чтобы связать данные из списка с моделью.

...