Asp.net MVC模块绑定并验证复杂类型

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

我正在asp.net mvc中构建一个调查问卷应用程序,但在使用复杂类型列表的模块绑定器时遇到了问题

第一:我无法使用活页夹获取inventory.IList.IList对象图。因此,在下面的示例代码中,我只使用了一个级别的IList

第二:我希望将我的存储库/工厂而不是类传递给活页夹,这样我就可以放弃表单问题和db问题之间的映射,只处理一组对象。或者至少比这段代码漂亮一点

有人给我指出了正确的方向吗

控制员:

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(如果存在),或者是某个代理值,例如一个负数,告诉您这是一个新实例