我是新来的视,但我已经超过这一点,阅读所有文件和所有的问题和所有博客我可以找到,我做到了完全包围绕的轴。

我在尝试做一个"创造"行动。我的数据条目是比较直线前进,并共同点:我有一个降下列表和一个文本框。在我的情况,我正在创建一个用户接触的通道,并降框选择之间的电子邮件和textmsg,并文本框然后进入相关联系信息,无论是一个良好形成的电子邮件地址或者移动电话号码。

这里有一个(简化形式的)我看页:

 <tr>
     <td><%= Html.DropDownList("ChannelDescription", Model.ChannelDescription, "Select a Channel", new { id = "ChannelDDL", onchange="ChannelDDLChanged()" })%>
         <br />
         <%= Html.ValidationMessage("ChannelDescription", "Please Select a Channel") %>
      </td>
      <td>
           <%= Html.TextBox("SubscriberNotificationAddr") %> <br />
           <%= Html.ValidationMessage("SubscriberNotificationAddr", "Please enter a contact address or number") %>
       </td>
  </tr>

我是使用强类型可视数据用模型,而不是使用ViewDataDictionary.该ChannelDescription元是一种选择列表,其初始化与名单的选择和没有选择。

最初显示的形式,将数据录入进入形式,并提取数据,从形式通过控制器进罚款。

我的问题是如果数据中含有错误,如《仲裁示范法》第形成的电子邮件地址或电话号码,并且我必须回到看,我没有成功获得的下拉菜单中选择重新显示。该ChannelDescription件是重建的在控制用户的选择,因为所选择的项目。我已经设置的断点在那条线图,并确认所选择的元素的列表中的项目已经选择的财产设定为真实的,但它仍然显示默认的"选择一个通道"。

这似乎是这将是一个很常见的情况,而不应该被这个艰苦。我做错了什么?

仅供参考,这是与视1.0(释放),Windows7和VS2008年下运行的火狐3.5.2.

有帮助吗?

解决方案 2

我与MVC团队的Brad Wilson进行了一些讨论,他向我解释说我误解了应该如何使用DropDownList助手方法(我认为可能相当普遍的误解,从我读过的内容) )。

基本上,EITHER在ViewModel的命名参数中给它SelectList,并让它从选择了适当项目的那个构建下拉列表,或者将SelectList作为单独的参数给它,并让它的命名参数ViewModel只是所选项的值字符串。如果给它一个SelectList参数,那么它期望命名值是字符串或字符串列表,而不是SelectList。

因此,现在您的ViewModel最终为视图中的一个概念项(下拉列表)提供了两个元素。因此,您可能拥有

的模型
string SelectedValue {get; set;}
SelectList DropDownElements { get; set;}

然后您可以使用选项预先填充DropDownElements,但在模型视图绑定中,您只需要处理SelectedValue元素。当我这样做时,它对我来说似乎很有效。

其他提示

之后观看以上的答案,我想检查出来,因为所有的例子,我看到了,事实上,使用ViewDataDictionary,而不是强类型ViewDataModel.

所以我做了一些实验。我建造了一个非常简单的看法,即用一个普通的ViewDataDictionary,并通过了值在通过名为键。它坚持所选择的项目就好了。然后我剪切和粘贴这一观点(和控制器)的一个又一个,仅仅改变什么是必要的,以切换到一个强类型可视数据用模型。瞧,你看,它还坚持所选择的项目。

所以还有什么是不同的我的简单的测试和应用程序?在我的测试,我不得不简单地用"Html。下拉列表("name","optionLabel")".然而,在我的应用程序,我有需要增加HTML属性,而只有重载可用,其中包括HtmlAttributes还包括选择名单。

事实证明,下拉列表载有一个选择清单参数被打破了!看下载的软源代码,当下拉列表称为只有一名或一名以及一个optionLabel,它结束了检索的目标选择名单的可视数据用,然后援引的私人SelectInternal方法通过以下呼吁:

    return SelectInternal(htmlHelper, optionLabel, name, selectList, true /* usedViewData */, false /* allowMultiple */, (IDictionary<string, object>)null /* htmlAttributes */);

然而,如果这就是所谓的一选择列表的参数,它结束了与以下:

   return SelectInternal(htmlHelper, optionLabel, name, selectList, false /* usedViewData */, false /* allowMultiple */, htmlAttributes);

不同的是,在第一个(其中将正常工作)的"usedViewData"参数是真实的,而在第二次,这是错误的。这实际上是好的,但暴露了内部的缺陷,在SelectInternal程序。

如果usedViewData是虚假的,它得到一个对象变量"默认值"从可视数据用模型。然而,默认值是使用,因为尽管它是一串或一系列的串的时候,实际上什么是返回的可视数据用是一种选择列表.(IEnumerable<SelectListItem>).

如果usedViewData是真的,那么默认值将null或一串。

然后如果默认值是不null,它最终进入一个方框代码,其中包含:

        foreach (SelectListItem item in selectList) {
            item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text);
            newSelectList.Add(item);

选择列表是原来选择列表,得通过,因此该项目是一个SelectListItem(string Text string值,以及布尔选择)。但selectedValues是来自默认值,并成为一个列表中的SelectLists,没有一串名单。因此,对于每一个项目,它设定的选择标志基于是否selectedValues清单"包含"的项目。值。嗯,一个列表中的SelectLists是永远不会去"包含"一字符串,因此该项目。选择的永远不会得到设置。(校正:实际上,在经追踪调试器,我发现,selectedValues是从默认值,通过一个"ToString()"的呼吁。所以它实际上是一串名单,但不是包含的价值,我们希望,它包含"系统。网。视.选择列表"的结果应用"ToString()"来复杂的对象像一个选择列表.结果还是一样-我们不会找到的价值,我们正在寻找的在于清单。)

然后,它的替代品的新构造"newSelectList"为原来的"选择列表",并进行建设HTML。

作为cagdas(我表示歉意屠宰你的名字,但我不知道如何做这些字符在我们的键盘)上面所说的,我认为我会建立我自己的方法来使用的地方的下拉列表HtmlHelper.我猜由于这种释放1和Release2是在测试阶段2中,我们真的不能指望任何错误的修正,除非我们这样做我们自己的权利?

顺便说一句,如果您已经跟了我这么远,这个代码在src\SystemWebMvc\软\Html\SelectExtensions.cs,在线116-136中

是的,我也有很多问题让DropDownList尊重我给它的选定项目。

请查看我的回答这个问题。据我所知,这是我能让它发挥作用的唯一方法。通过ViewData传递列表。

仅供参考,我停止使用该HtmlHelper方法。我现在只是通过循环输出&lt; select&gt; &lt; option&gt; 标签并设置<的 selected 属性我自己检查代码>选项标记。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top