Asp.net MVC模块绑定并验证复杂类型
我正在asp.net mvc中构建一个调查问卷应用程序,但在使用复杂类型列表的模块绑定器时遇到了问题 第一:我无法使用活页夹获取inventory.IList.IList对象图。因此,在下面的示例代码中,我只使用了一个级别的IList 第二:我希望将我的存储库/工厂而不是类传递给活页夹,这样我就可以放弃表单问题和db问题之间的映射,只处理一组对象。或者至少比这段代码漂亮一点 有人给我指出了正确的方向吗 控制员:Asp.net MVC模块绑定并验证复杂类型,asp.net,asp.net-mvc,asp.net-mvc-beta1,model-binders,Asp.net,Asp.net Mvc,Asp.net Mvc Beta1,Model Binders,我正在asp.net mvc中构建一个调查问卷应用程序,但在使用复杂类型列表的模块绑定器时遇到了问题 第一:我无法使用活页夹获取inventory.IList.IList对象图。因此,在下面的示例代码中,我只使用了一个级别的IList 第二:我希望将我的存储库/工厂而不是类传递给活页夹,这样我就可以放弃表单问题和db问题之间的映射,只处理一组对象。或者至少比这段代码漂亮一点 有人给我指出了正确的方向吗 控制员: public class QuestionnaireController : Con
public class QuestionnaireController : Controller
{
#region Constructors
public QuestionnaireController(IRepositoryWithTypedId<QuestionGroup, string> questionnaireRepository)
{
repository = questionnaireRepository;
}
#endregion
public ActionResult Create(string Id)
{
if (!string.IsNullOrEmpty(Id))
{
QuestionGroup questionnaire = repository.Get(Id);
return View(questionnaire);
}
else return RedirectToAction("Index");
}
[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(string Id, QuestionGroup questionGroup)
{
QuestionGroup dbQuestionGroup = repository.Get(Id);
//Map Questions in form to Questions from db
foreach (var question in dbQuestionGroup.Questions)
{
Question persQuestion =
(from item in questionGroup.Questions where item.QuestionID.Equals(question.ID) select item)
.SingleOrDefault();
if (persQuestion != null)
{
question.Answer = persQuestion.Answer;
}
}
//Validate Questions(db)
bool valid = true;
foreach (var question in dbQuestionGroup.Questions)
{
if (!question.IsValid())
{
foreach (var item in question.ValidationMessages)
{
ViewData.ModelState.AddModelError("questionGroup.Questions[" + question.ID + "]." +
item.PropertyName,
item.Message);
}
valid = false;
}
}
//Return the same form with validation info appended
if (!valid)
{
return View(dbQuestionGroup);
}
//Persist to db and redirect to Complete
else
{
repository.SaveOrUpdate(dbQuestionGroup);
return RedirectToAction("Complete");
}
}
private IRepositoryWithTypedId<QuestionGroup, string> repository;
}
“部分视图”主视图只是对问题组中的问题进行了一次foreach,并为每个问题呈现此视图
<div class="Question">
<div class="QuestionTitle">
<%=ViewData.Model.Description %>
</div>
<input name="questionGroup.Questions.Index" value='<%=ViewData.Model.ID %>' type="hidden" />
<input name='<%="questionGroup.Questions[" + ViewData.Model.ID + "].QuestionID" %>' value='<%=ViewData.Model.ID %>' type="hidden" />
<div class="QuestionText">
<%switch (ViewData.Model.Type.ToLower())
{
case QuestionType.Text:%>
<%=Html.TextBox("questionGroup.Questions[" + ViewData.Model.ID + "].Answer")%>
<% break;
case QuestionType.Number:%>
<%=Html.TextBox("questionGroup.Questions[" + ViewData.Model.ID + "].Answer")%>
<%= Html.ValidationMessage("questionGroup.Questions[" + ViewData.Model.ID + "].Answer")%>
<% break;
case QuestionType.PhoneNumber:%>
<%=Html.TextBox("questionGroup.Questions[" + ViewData.Model.ID + "].Answer")%>
<% break;
case QuestionType.Email:%>
<%=Html.TextBox("questionGroup.Questions[" + ViewData.Model.ID + "].Answer")%>
<%= Html.ValidationMessage("response.Questions[" + ViewData.Model.ID + "].Answer")%>
<% break;
case QuestionType.Date:%>
<%=Html.TextBox("questionGroup.Questions[" + ViewData.Model.ID + "].Answer")%>
<% break;
case QuestionType.YesNo:%>
<%=Html.RadioButton("questionGroup.Questions[" + ViewData.Model.ID + "].Answer", "0", true)%>Ikke valgt<br />
<%=Html.RadioButton("questionGroup.Questions[" + ViewData.Model.ID + "].Answer", "true", false)%>Ja<br />
<%=Html.RadioButton("questionGroup.Questions[" + ViewData.Model.ID + "].Answer", "false", false)%>Nei<br />
<% break;
case QuestionType.Alternative:%>
<%=Html.DropDownList("questionGroup.Questions[" + ViewData.Model.ID + "].Answer", new SelectList(ViewData.Model.Alternatives, "ID", "Description"))%>
<% break;
}%>
</div>
</div>
您可以编写自己的定制ModelBinder,这需要您编写两种方法。请参阅UpdateCollection方法。然后,您可以将存储库传递给自定义ModelBinder。我已经介绍了如何使用MvcContrib.FluentHtml执行此操作: 我看到的一个问题是,您正在将问题列表项的索引器的值设置为问卷ID,这是两个级别。该值应该是问题的ID(如果存在),或者是某个代理值,例如一个负数,告诉您这是一个新实例