Asp.net mvc MVC设计问题

Asp.net mvc MVC设计问题,asp.net-mvc,Asp.net Mvc,我正在做一份调查问卷。问卷有多个部分,每个部分有多个问题,每个问题可以有一对多个答案。每个问题可以是不同的类型(单选按钮、复选框、文本…) 我将表格放在模型中,循环浏览sections表格以显示章节,循环浏览问题以显示问题,循环浏览answerOptions以填充答案: <fieldset> <legend>Fields</legend> <%foreach (var s in Model.Sections)

我正在做一份调查问卷。问卷有多个部分,每个部分有多个问题,每个问题可以有一对多个答案。每个问题可以是不同的类型(单选按钮、复选框、文本…)

我将表格放在模型中,循环浏览sections表格以显示章节,循环浏览问题以显示问题,循环浏览answerOptions以填充答案:

     <fieldset>
        <legend>Fields</legend>
        <%foreach (var s in Model.Sections)
          { %>
          <h3><%=s.SCTN_TXT %></h3>
          <% var QuestsInSect = Model.GetQuestionsBySectionID(s.SCTN_ID);%>
          <%foreach (var q in QuestsInSect){%>
            <h4><%=q.QSTN_TXT %><%=q.QSTN_ID.ToString() %></h4>
            <% var answers = Model.GetAnswerOptionByQuestionID(q.QSTN_ID); %>
             <%if (q.QSTN_TYP_ID>= 3)
              {%>

                <%:Html.TextBox(q.QSTN_ID.ToString())%>

            <%}
            else if (q.QSTN_TYP_ID == 1)
              { %>
                <%var answerOptions = Model.GetDropDownListAnswerOptionByQuestionID(q.QSTN_ID);%>

                <%:Html.DropDownList(q.QSTN_ID.ToString(), answerOptions)%>
              <%}
              else
              { %>
                  <% foreach (var ao in answers)
                     { %>
                        <br />
                        <%:Html.CheckBox(q.QSTN_ID.ToString())%>
                        <%=ao.ANS_VAL%>

        <%        }     
              }
            }
          } %>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

领域
= 3)
{%>

在我的控制器中,我在集合中循环。所有键找出每个问题的答案:

        [HttpPost]
    public ActionResult Create(FormCollection collection)
    {
        try
        {
            // TODO: Add insert logic here
            List<ASSMNT_RESP> arList = new List<ASSMNT_RESP>();


            foreach (string key in collection.AllKeys)
            {
                QSTN q = _model.GetQuestionByQuestionID(int.Parse(key));
                IEnumerable<ANS_OPTN> aos = _model.GetAnswerOptionByQuestionID(int.Parse(key));
                ASSMNT_RESP ar = new ASSMNT_RESP();
                ar.QSTN_ID = int.Parse(key);
                ar.ASSMNT_ID = 1;

                if (q.QSTN_TYP_ID == 1)//dropdown
                {
                    //do something
                }
                else if (q.QSTN_TYP_ID == 2)//checkboxlist
                {
                    //do something

                }
                else
                {
                    //do something    
                }



                //_model.AddAssessmentResponse(ar);
                System.Diagnostics.Trace.WriteLine(key + "---"+ collection[key]);

            }
            //_model.Save();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
[HttpPost]
公共操作结果创建(FormCollection集合)
{
尝试
{
//TODO:在此处添加插入逻辑
列表列表=新列表();
foreach(collection.allkey中的字符串键)
{
QSTN q=_model.GetQuestionByQuestionID(int.Parse(key));
IEnumerable aos=_model.GetAnswerOptionByQuestionID(int.Parse(key));
ASSMNT_RESP ar=新ASSMNT_RESP();
ar.QSTN_ID=int.Parse(键);
ar.ASSMNT_ID=1;
if(q.QSTN\u TYP\u ID==1)//下拉列表
{
//做点什么
}
else if(q.QSTN\u TYP\u ID==2)//复选框列表
{
//做点什么
}
其他的
{
//做点什么
}
//_模型。添加评估响应(ar);
System.Diagnostics.Trace.WriteLine(键+“--”+集合[key]);
}
//_model.Save();
返回操作(“索引”);
}
接住
{
返回视图();
}
}
它可以工作,但我认为它不是一个很好的设计。看起来我在视图中有太多的逻辑。我想将视图和控制器中的逻辑移到模型中。你能推荐一种更简单/更干净的方法吗


谢谢。

我不是MVC方面的专家,但我认为使用基于您构建的自定义模型类的强类型视图会给您带来很多好处。此类模型公开的属性可以嵌套(即,顶级模型可以由属性组成,每个属性都是自定义类)。从概念上讲,类似于:

public class MyTopLevelModel
{
   public MySubModel1 SubModel1 { get; set; }
   public MySubModel2 SubModel2 { get; set; }
}

public class MySubModel1
{
   public string AProperty { get; set; }
   public int AnotherProperty { get; set; }
}
您还可以在类定义中包含集合。然后,您可以使用指定是否需要特定属性、允许值范围等的属性来装饰各个属性


不过,这是一个很重要的主题,而这仅仅触及了表面。FWIW,我从Steven Sanderson的Pro ASP.NET MVC2框架书中得到了很多东西。

使您的视图模型更加清晰

public class ViewModel 
{
    public IList<SectionViewModel> Sections {get;set;}
}

public class SectionViewModel 
{
    public IList<QuestionViewModel> Questions {get;set;}
}

public class QuestionViewModel 
{
    public IList<AnswerViewModel> Answers {get;set;}
}
公共类视图模型
{
公共IList节{get;set;}
}
公共类分区视图模型
{
公共IList问题{get;set;}
}
公共类问题视图模型
{
公共IList答案{get;set;}
}
在您看来,您可以这样做(我使用的是razor):

@foreach(Model.Sections中的var节)
{
@章节名称
foreach(第节中的var问题。问题)
{
@问题.姓名
foreach(第节中的var问题。问题)
{
@EditorFor(x=>question.Answers)
}  
}
}

然后为您的ActhReView模型创建一个编辑器模板。< /P>马克,谢谢回答。实际上我使用了强类型视图。节是一个属性。我在属性中也提出了问答选项,但是我发现调用一个函数在一个部分中返回问题更容易。您可以考虑在CODIEView而不是-DES上问这个问题。抄录为“…一个问答网站,用于共享您正在进行的项目的代码,以供同行审查。”

@foreach(var section in Model.Sections)
{
   <h3>@section.Name</h3> 

   foreach(var question in section.Questions)
   {
      <h4>@question.Name</h4>

      foreach(var question in section.Questions)
      {
         @Html.EditorFor(x=> question.Answers)
      }  
   }
}