【发布时间】: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<AnswerQuestionViewModel> viewmodel) -
你的模型是
List<AnswerQuestionViewModel>,而实际参数是AnswerQuestionViewModel类型的对象 -
虽然您的 switch 语句意味着
Answer属性的输入可能不包含在视图中,这意味着绑定将失败 - 您必须包含一个输入(可能是隐藏输入) -
那么如果
ModelState无效,它将再次失败,除非您调用数据库以获取每个问题的Type属性,或者为其包含隐藏的输入。 -
嗨@StephenMuecke,再次感谢您的反馈。我尝试了 List
但 viewmodel.Answer 需要更改为 viewmodel[i].Answer?你能给我一些代码指导吗?将不胜感激!
标签: c# linq asp.net-mvc-4 razor