Попытка передать значения формы, когда только часть формы связывается с моделью (с ASP.Net MVC3) - PullRequest
0 голосов
/ 16 ноября 2011

Я заранее прошу прощения за стену текста ниже. Я надеюсь сразу предоставить всю информацию, которая может понадобиться, чтобы понять, что я делаю.

У меня есть страница, где я собираю некоторую базовую информацию о пользователе (имя, адрес электронной почты и т. Д.). В другой части страницы у меня есть форма с несколькими вариантами ответов (с использованием радиовходов для каждого вопроса). Моя цель - собрать контактную информацию, обработать ответы на вопросы и сохранить результаты с контактной информацией в таблице QuizResults.

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

Вот мои модели, связанные с викториной:

public class QuizType {

    public QuizType() {
        this.QuizQuestions = new HashSet<QuizQuestion>();
        this.QuizResults = new HashSet<QuizResult>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<QuizQuestion> QuizQuestions { get; set; }
    public virtual ICollection<QuizResult> QuizResults { get; set; }
}

public class QuizQuestion {

    public QuizQuestion() {
        this.QuizAnswers = new HashSet<QuizAnswer>();
    }

    public int Id { get; set; }
    public string Question { get; set; }
    public int Order { get; set; }
    public int QuizTypeId { get; set; }

    public virtual ICollection<QuizAnswer> QuizAnswers { get; set; }
    public virtual QuizType QuizType { get; set; }
}

public class QuizResult {
    public int Id { get; set; }
    public string TesterName { get; set; }
    public string TesterEmail { get; set; }
    public string TesterCompany { get; set; }
    public string TesterPhone { get; set; }
    public string ApproverName { get; set; }
    public string ApproverEmail { get; set; }
    public bool HasCompanyIssuedIdBadge { get; set; }
    public int Score { get; set; }

    public virtual QuizType QuizType { get; set; }
}

public class QuizAnswer {

    public QuizAnswer() {
    }

    public int Id { get; set; }
    public bool isCorrectAnswer { get; set; }
    public string Answer { get; set; }
    public int QuizQuestionId { get; set; }

    public virtual QuizQuestion QuizQuestion { get; set; }
}

Таким образом, в основном я могу создать тип викторины, тогда для каждого типа я могу создать несколько вопросов, на каждый вопрос может быть несколько ответов. Я не пытаюсь опубликовать какие-либо данные для QuizType, QuizQuestion или QuizAnswer. Это только для того, чтобы помочь построить мою страницу [ы].

Здесь я начинаю чесать голову. Мне нужно иметь возможность перебирать QuizQuestions и QuizAnswers, чтобы создать форму множественного выбора. Но мне также нужно привязать часть этой формы к QuizResults для отправки обратно ... вот что я получил сейчас, чтобы отобразить форму (но не работать правильно).

Сначала я создал ViewModel:

public class QuizViewModel {
    public IQueryable<QuizQuestion> QuizQuestions { get; set; }
    public QuizResult QuizResults { get; set; }
}

Тогда в моем контроллере:

    public ViewResult Index() {

        var questions = 
            from q in unitOfWork.QuizQuestionRepository.Get() 
            where q.QuizType.Name.Equals("QuizTypeOne")
            select q;

        var qvm = new QuizViewModel { 
            QuizQuestions = questions
        };

        return View(qvm);
    }

Я не буду публиковать весь свой вид бритвы, но я думаю, что это соответствующие части:

@model QuizViewModel

@* *** MISC STYLE, JS, ETC LEFT OUT FOR BREVITY *** *@

@using (Html.BeginForm()) {

    @Html.LabelFor(model => model.QuizResults.TesterName)<br />
    @Html.EditorFor(model => model.QuizResults.TesterName)

    @* *** OTHER FORM FIELDS LEFT OUT FOR BREVITY *** *@

    foreach (var item in Model.QuizQuestions) {
        <div class="wizard-step">
            <h3>@item.Question</h3>
            @{
                // I've been tinkering with this trying to find a way to get it
                // so that the input would have the right id to be picked up and
                // dropped into my post object correctly
                var inputId = "SelectedAnsers[" + item.Id + "]";
            }
            @foreach (var answer in item.QuizAnswers) {
                <input type="radio" id="@inputId" name="@inputId" value="@answer.Id" /> @answer.Answer @:(@answer.isCorrectAnswer)
                <br />
            }
        </div>
    }

}

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

[HttpPost]
public ViewResult DukeDrive(QuizViewModel quizViewModel) {
    // I have a breakpoint set so that I can inspect quizViewModel
    return View();
}

В моей голове я хочу иметь возможность обрабатывать значения в форме викторины, вычислять баллы, а затем создавать новый объект QuizResult на основе заполненной контактной информации и нового счета calc. Я буду проклят, если смогу найти правильный способ сделать это.

Есть указатели?

1 Ответ

2 голосов
/ 16 ноября 2011

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

[HttpPost]
public ViewResult DukeDrive(QuizViewModel quizViewModel, FormCollection formData) {
    // I have a breakpoint set so that I can inspect quizViewModel
    return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...