【问题标题】:Returning results to the Controller not in the ViewModel将结果返回给不在 ViewModel 中的控制器
【发布时间】:2014-06-05 15:44:23
【问题描述】:

我有一个用于调查的 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>&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")
}

【问题讨论】:

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

标签: c# asp.net-mvc entity-framework visual-studio-2012 model-view-controller


【解决方案1】:

我的问题是显示来自许多表的数据并将其保存到视图中不需要显示的表中。

这是两个不同的东西。您在页面上显示的数据以及您如何获取这些数据与您如何接收或将其保存回数据库无关。

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

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

【讨论】:

    【解决方案2】:

    您应该将表单的操作参数设置为您想要处理数据的任何操作(在任何控制器中)。当您提交表单时,它们将被传递给指定的操作。它可以通过多种方式完成:从一开始就在 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 基础知识的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2016-04-22
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多