【问题标题】:ASP.NET MVC Two Way Data Binding of Model to Radio Button List using Typed ModelASP.NET MVC 使用类型化模型将模型双向数据绑定到单选按钮列表
【发布时间】:2009-12-09 15:56:09
【问题描述】:

我有一个由单选按钮矩阵组成的 mvc 视图。每行单选按钮都在一个组中,代表模型中的一个类型化对象。使用各种博客和帖子的指导,我已经成功地将发布的表单结果绑定到控制器操作中的类型化模型数组,但是似乎无法成功地反转效果并将现有模型绑定到单选按钮,同时保留它们的选中或未选中状态.

我的模型包含一个名为“AnswerValue”的属性,它介于 0 和 4 之间,应该与单选按钮名称匹配。我尝试将索引值更改为模型值“AnswerId”,但这样做的绑定不再起作用(我相信索引必须从零开始)。这是我到目前为止使用的一些资源PostArticle by Scott Hanselman 来达到我现在的位置。

如果有人对如何执行这两种方式绑定有任何见解,将不胜感激。

谢谢

我的控制器:

[AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Save([Bind(Prefix = "SurveyAnswer")] SurveyAnswer[] responses, int SurveyID)
  {

我的看法:

<%
  int questionIndex = 0; 
  foreach (SurveyAnswer q in Model)
  {

%>
  <%=Html.Hidden("SurveyAnswer.Index", questionIndex)%>
  <%=Html.Hidden("SurveyAnswer["+questionIndex+"].AnswerId", q.AnswerId) %>
  <tr>
    <td style='background-color: #aaaaaa;padding-left: 10px; padding-right: 10px;border-right: solid 1px #fffff;'><%= questionIndex+1 %></td>
    <td style='text-align: right;'><%= q.Question.DisplayValue %></td>
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "0", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue"})%></td>
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "1", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue" })%></td>
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "2", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue" })%></td>
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "3", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue"})%></td>
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "4", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue" })%></td>
  </tr>
<%
    questionIndex++; 
  }
%>

【问题讨论】:

    标签: asp.net asp.net-mvc data-binding strong-typing


    【解决方案1】:

    单选按钮本身不识别 True/False 以外的值(就状态而言)。 因此,您必须将值与实际位置进行比较,并明确设置 TRUE /FALSE 状态。

    试试这个单选按钮助手的重载。

    <%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "0", q.AnswerValue == 0)%>
    <%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "1", q.AnswerValue == 1)%>
    <%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "2", q.AnswerValue == 2)%>
    <%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "3", q.AnswerValue == 3)%>
    <%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "4", q.AnswerValue == 4)%>
    

    如果您使用的是 ViewModel,也许最好将这个逻辑问题 (q.AnswerValue == 4) 放在那里而不是直接放在视图中。

    PS:我认为您可以删除最后一个参数,因为第一个参数已经将 ID 和名称属性设置为:"SurveyAnswer[" + questionIndex + "].AnswerValue"

    【讨论】:

    • 如果我使用实体框架和生成的实体集,那么扩展它以保持您推荐的逻辑的好方法是什么。感谢你目前的帮助。似乎工作。
    • 如果您不使用 ViewModel 模式,最好保留它,因为这将涉及更改控制器的某些逻辑、视图中的观察模型类型以及您的验证程序。当您有复杂的模型(例如 2 个或更多实体集组合成一个表单或设置 SelectList/RadioButtons/..)时,它们主要使用,如果您想查看更多此模式,请查看 geekswithblogs.net/michelotti/archive/2009/10/25/… 或ScottGu 在他的 ASP.NET MVC 1.0 Book 中的“使用 ViewModel 模式”部分。
    猜你喜欢
    • 2013-06-29
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多