【问题标题】:Posting a list of input in MVC4在 MVC4 中发布输入列表
【发布时间】:2015-06-12 09:12:27
【问题描述】:

生成问题列表让用户输入后,我想发布他们的输入并保存到数据库中,但我的视图模型无法在文本字段中获取用户输入的内容。有什么提示或指导吗?

我的视图模型:

@model List<SurveyTool.Models.AnswerQuestionViewModel>

@{
    ViewBag.Title = "Edit";
}

<br/>
<h2>Questions</h2>
<br/>



@using (Html.BeginForm())
{
    <table>

        @for (int i = 0; i < Model.Count; i++)
        {
            <tr>
                <td>
                    @Html.HiddenFor(m => m[i].Survey_ID)
                    @Html.HiddenFor(m => m[i].MaxChar)
                    @Html.DisplayFor(m => m[i].Question)
                </td>
            </tr>
            <tr>
                @switch (Model[i].Type)
                {
                    case "Info_Text":
                        {
                            <td></td>

                        }
                        break;

                    case "Single_Line":
                        {
                            <td>
                                @Html.EditorFor(m=>m[i].Answer, new { @maxlength = Model[i].MaxChar}) << textbox to input answer.
                            </td>
                        }
                        break;

                    case "Multiple_Line":
                        {
                            <td>
                                @Html.TextAreaFor(m => m[i].Answer)
                            </td>
                        }
                        break;
                }

            </tr>
            }


    </table>

    <input value="Submit" type="submit" class="btn" />
}

我的控制器:

[HttpPost]
        public ActionResult SURV_Answer_Submit(AnswerQuestionViewModel viewmodel)
        {
            if (ModelState.IsValid)
            {
                  var query = from r in db.SURV_Question_Ext_Model.ToList()
                        join s in db.SURV_Question_Model
                        on r.Qext_Question_ID equals
                        s.Question_ID
                        where  s.Question_Survey_ID == viewmodel.Survey_ID && r.Qext_Language == viewmodel.Language
                        orderby s.Question_Position ascending
                        select new { r, s };

                foreach(var item in query)
                {
                    var answer = new SURV_Answer_Model();
                    answer.Answer_Qext_ID = item.r.Qext_Question_ID;
                    answer.Answer_Data = viewmodel.Answer; << can't get input!
                    db.SURV_Answer_Model.Add(answer);
                    db.SaveChanges();
                }


                return RedirectToAction("SURV_Main_Index", "SURV_Main");
  }

            return View(viewmodel);
        }

【问题讨论】:

  • 你在视图中的模型是一个集合,所以你的POST方法需要是public ActionResult SURV_Answer_Submit(List&lt;AnswerQuestionViewModel&gt; viewmodel)
  • 你的模型是List&lt;AnswerQuestionViewModel&gt; ,而实际参数是AnswerQuestionViewModel类型的对象
  • 虽然您的 switch 语句意味着 Answer 属性的输入可能不包含在视图中,这意味着绑定将失败 - 您必须包含一个输入(可能是隐藏输入)
  • 那么如果ModelState 无效,它将再次失败,除非您调用数据库以获取每个问题的Type 属性,或者为其包含隐藏的输入。
  • 嗨@StephenMuecke,再次感谢您的反馈。我尝试了 List 但 viewmodel.Answer 需要更改为 viewmodel[i].Answer?你能给我一些代码指导吗?将不胜感激!

标签: c# linq asp.net-mvc-4 razor


【解决方案1】:

视图中的模型定义为@model List&lt;AnswerQuestionViewModel&gt;,这意味着需要将POST方法签名更改为

public ActionResult SURV_Answer_Submit(List<AnswerQuestionViewModel> viewmodel)

使用循环访问模型中的每个项目并保存。

但也存在一些其他问题。 DefaultModelBinder 要求集合索引器从零开始并且是连续的,但是您的 @switch (Model[i].Type) 语句意味着可能不会呈现 Answer 的表单控件。为确保在您提交时绑定不会失败,请为 case "Info_Text": 添加隐藏输入。

您也没有为 Type 属性包含表单控件,因此如果 ModelState 无效并且您返回视图,您的代码将失败(Type 的值将是 null)所以您要么需要在返回视图之前包含隐藏的输入或再次调用数据库以获取值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多