我有一个用于调查的VS2012,MVC 4,Entity Framework 4.0项目。我很难找到一种方法将结果返回给我的控制器。大多数答案将来自下拉列表,每个问题一个。我使用视图将表格展平为一个简洁的对象,其中包含我在视图中需要的所有信息。 SQL视图如下所示:
SELECT TOP (100) PERCENT
Questionaires.QuestionaireKey,
Questionaires.QuestionaireName,
Sections.SectionKey,
Sections.SectionName,
QuestionaireSections.DefaultSequence AS QAS_Sequence,
Questions.QuestionKey,
Questions.Question,
SectionQuestions.DefaultSequence AS SQ_Sequence,
QuestionTypes.QuestionTypeKey,
QuestionTypes.QuestionTypeName,
AnswerListCodes.AnswerListCodeKey,
AnswerListCodes.AnswerListCodeName,
QuestionAnswerListCodes.DefaultSequence AS QALC_Sequence
FROM dbo.Questionaires AS Questionaires
INNER JOIN dbo.QuestionaireSections AS QuestionaireSections
ON Questionaires.QuestionaireKey = QuestionaireSections.QuestionaireKey
INNER JOIN dbo.Sections AS Sections
ON QuestionaireSections.SectionKey = Sections.SectionKey
INNER JOIN dbo.SectionQuestions AS SectionQuestions
ON Sections.SectionKey = SectionQuestions.SectionKey
INNER JOIN dbo.Questions AS Questions
ON SectionQuestions.QuestionKey = Questions.QuestionKey
INNER JOIN dbo.QuestionTypes AS QuestionTypes
ON Questions.QuestionTypeKey = QuestionTypes.QuestionTypeKey
INNER JOIN dbo.QuestionAnswerListCodes AS QuestionAnswerListCodes
ON Questions.QuestionKey = QuestionAnswerListCodes.QuestionKey
INNER JOIN dbo.AnswerListCodes AS AnswerListCodes
ON QuestionAnswerListCodes.AnswerListCodeKey = AnswerListCodes.AnswerListCodeKey
每个问题都有来自AnswerListCodes的答案。我理解vw_Questions实体是只读的。需要保存的数据在Answers& EvaluationAnswers表。到目前为止,我的控制器代码是:
public ActionResult Index()
{
ViewBag.Answers = db.Answers.ToList();
ViewBag.EvaluationAnswers = db.EvaluationAnswers.ToList();
return View(db.vw_Questions.ToList());
}
这样会产生display that I'm looking。
我没有看到如何将每个下拉列表中的选定答案返回给我的控制器。一些答案也是文字。
查看代码:
@model IEnumerable<Prototype_06.Models.vw_Questions>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<style>
table { border-collapse:collapse; }
table,th, td {border: 1px solid gray; }
</style>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
<table>
@foreach (var group in (Model.OrderBy(x => x.QAS_Sequence).GroupBy(item => item.SectionName)))
{
<tr>
<th colspan="3">@group.Key</th>
</tr>
foreach (var item in group.OrderBy(x => x.SQ_Sequence).GroupBy(subItem => subItem.Question).Distinct()) {
<tr>
<td> </td>
<td>@item.Key</td>
<td>
<select>
<option value="@Guid.Empty"></option>
@foreach (var ans in item.OrderBy(x => x.QALC_Sequence))
{
<option value="@ans.AnswerListCodeKey">@ans.AnswerListCodeName</option>
}
</select>
</td>
</tr>
}
}
</table>
<p>
<input type="submit" value="Save" />
</p>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
答案 0 :(得分:0)
我的问题是显示来自多个表的数据并保存到视图中不需要显示的表中。
这是两件不同的事情。您在页面上显示的数据以及获取方式与您收到数据或将其保存回数据库无关。
使用视图并不是一个完全糟糕的主意,但它的实用性是有限的。首先,视图没有索引,因此如果您打算发出SELECT *
以外的任何内容,您的查询将会相当慢。就个人而言,我从未在MVC应用程序中找到数据库视图的用途。当实体框架本身不够好或不够高效时,我使用存储过程。
从存储过程返回所需的数据,然后使用它来构建视图模型以供显示。对于您的后期操作,您可以使用不同的视图模型(如果需要),甚至是您计划保存到的实际实体,如果这些字段可以由模型绑定器映射(即表单中的字段名称与实体上的字段名称相同) )。如果您需要使用视图模型进行发布,则可以将视图模型中的发布数据映射到您手动保存的实体,或者使用AutoMapper等工具。
答案 1 :(得分:0)
您应该将表单的action参数设置为要处理数据的任何操作(在任何控制器中)。提交表单时,它们将传递给指定的操作。它可以通过几种方式完成:从头开始在BeginForm语句中声明它,如:
Html.BeginForm("ProcessAnswers","Questionary",FormMethod.Post,new{id="frmQuestionary"})
如果表单将始终执行相同的操作。如果由于某种原因你需要根据某些条件(不太常见)发布不同的动作,可以在javascript中动态更改动作,你可以将动作设置为所需的值(最好在发布之前以避免错误),例如:
$('#frmQuestionary').attr('action', vURLOfDesiredAction); //vURLOfDesiredAction must have the proper url value, previously set from server side
现在,关于您要发布的操作,它应该能够获取您发送的数据。这也可以通过多种方式完成,(如果您不清楚它,您应该阅读有关MVC数据绑定的工作原理!)。首先,你必须设置你想要发布的控件的名称,你在那里的选择控件没有名称,所以做类似的事情
<select name="AnswerId">
(考虑到在您的操作中,您将该数据存储在名为AnswerId的模型字段中,至少名为AnswerId的变量将是接收该值的变量 - 如果您使用分隔参数声明操作的话) 此操作将处理的模型,不一定必须与您在上一个视图中定义的用于显示数据的模型一致,但它必须是您发送给它的数据的正确模型,并且当您获得数据时,嗯...你把它保存在应该保存的表中。
正如@Blaise已经评论过,我建议您阅读有关MVC基础知识的更多信息