C# 将结果返回到不在ViewModel中的控制器

C# 将结果返回到不在ViewModel中的控制器,c#,asp.net-mvc,entity-framework,visual-studio-2012,model-view-controller,C#,Asp.net Mvc,Entity Framework,Visual Studio 2012,Model View Controller,我有一个VS2012、MVC4、EntityFramework4.0的调查项目。我很难想出一种方法将结果返回给我的控制器。大多数答案将来自下拉列表,每个问题一个。我正在使用一个视图来为一个简洁的对象平展表,其中包含我在视图中需要的所有信息。SQL视图如下所示: SELECT TOP (100) PERCENT Questionaires.QuestionaireKey, Questionaires.QuestionaireName, Sections.Section

我有一个VS2012、MVC4、EntityFramework4.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
每个问题都有答案列表代码中的可能答案。我知道vw_实体是只读的。需要保存的数据位于Answers&EvaluationAnswers表中。到目前为止,我的控制器代码是:

public ActionResult Index()
{
    ViewBag.Answers = db.Answers.ToList();
    ViewBag.EvaluationAnswers = db.EvaluationAnswers.ToList();
    return View(db.vw_Questions.ToList());
}
这将导致出现一个for here

我不知道如何将每个下拉列表中选定的答案返回到我的控制器。一些答案也将是文本

查看代码:

@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>&nbsp;</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")
}
@model IEnumerable
@{
ViewBag.Title=“Index”;
}
指数
表{边框折叠:折叠;}
表,th,td{边框:1px实心灰色;}
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@foreach(模型中的var组(Model.OrderBy(x=>x.QAS_序列).GroupBy(item=>item.SectionName)))
{
@组键
foreach(group.OrderBy(x=>x.SQ_序列)中的var项).GroupBy(subItem=>subItem.Question.Distinct()){
@项目.关键
@foreach(item.OrderBy中的变量ans(x=>x.QALC_序列))
{
@ans.AnswerListCodeName
}
}
}

} @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
我的问题是显示许多表中的数据,并将其保存到视图中不需要显示的表中

这是两件不同的事情。页面上显示的数据以及获取数据的方式与接收数据或将数据保存回数据库的方式无关

使用视图并非完全是一个坏主意,但它的实用性是有限的。基本上,视图没有索引,因此如果您打算发出除
SELECT*
之外的任何内容,那么您的查询将非常缓慢。就我个人而言,我从未在MVC应用程序中发现数据库视图的用途。当实体框架本身不够好或不够高效时,我使用存储过程


从存储过程返回所需的数据,然后使用该数据构建视图模型以供显示。对于post操作,如果需要,您可以使用不同的视图模型,甚至可以使用您计划保存到的实际实体(如果modelbinder可以映射字段)(即表单中的字段名与实体上的字段名相同)。如果需要使用视图模型进行post,则可以手动或使用AutoMapper之类的工具将发布的数据从视图模型映射到要保存的实体。

应将表单的操作参数设置为要处理数据的任何操作(在任何控制器中)。当您提交表单时,它们将被传递给指定的操作。可以通过几种方式完成:从一开始就在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控件没有名称,请执行以下操作

<select name="AnswerId">

(这是考虑到在您的操作中,您将在名为AnswerId的模型字段中存储该数据,或者至少名为AnswerId的变量将是接收该值的变量-以防您使用单独的参数声明操作) 此操作将处理的模型不一定要与您在以前的视图中定义的模型一致,以显示数据,但它必须是您发送给它的数据的正确模型,并且当您获得数据时。。。您可以将其保存在应该保存的表中


正如@Blaise已经评论过的那样,我建议您阅读更多关于MVC基础知识的内容

,因此您希望一旦用户做出选择,控制器就会知道并返回一个新的视图模型。我猜?还是很困惑。提交表单后,它将发布到表单的
action
属性中指定的控制器操作。那么,您能在您的视图中向我们展示代码吗?我认为一个关键部分是找到一种以MVC方式呈现dropdownlist的方法。我认为这将允许所选结果显示在发布的数据中好的,我认为你远远不了解MVC。视图模型不是这样构建的。请查看最基本的教程。我看过很多基本的例子,它们只处理单个表,我知道它们是如何工作的。我的问题是显示许多表中的数据,并将其保存到视图中不需要显示的表中。