尝试提交表单值,其中只有部分表单绑定到模型(使用ASP.Net MVC3)

时间:2011-11-16 15:49:19

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework

我提前为下面的一面墙文道歉。我希望能够提供所有信息,以便了解我正在做什么。

我有一个页面,我正在收集一些基本的用户信息(姓名,电子邮件等)。在页面的另一部分,我有一个多项选择测验表格(每个问题使用无线电输入)。我的目标是收集联系信息,处理测验答案,并在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对象。如果我能找到正确的方法,我会很高兴。

任何指针?

1 个答案:

答案 0 :(得分:2)

您可以添加另一个FormCollection类型的参数,其中包含所有发布的值。

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