首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC - Html.DropDownList -值不是通过ViewData.Model设置的

ASP.NET MVC - Html.DropDownList -值不是通过ViewData.Model设置的
EN

Stack Overflow用户
提问于 2008-12-23 21:09:19
回答 5查看 80.4K关注 0票数 17

刚刚开始使用ASP.NET MVC,遇到了以下情况。这感觉很像一个bug,但如果不是,请解释一下:)

视图包含非常基本的内容

代码语言:javascript
复制
<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>

不使用模型时,将按预期设置值和所选项目:

代码语言:javascript
复制
//works fine
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX'
  ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC'

  return View();
}

但是,当试图通过模型加载时,文本框具有预期的值设置,但下拉列表没有获得选定的项集。

代码语言:javascript
复制
//doesnt work
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  var model = new {
    MyList = "XXX", //set the selected item to be the one with value 'XXX'
    MyTextBox = "ABC" //sets textbox value to 'ABC'
  }

  return View(model);
}

有什么想法吗?我现在的想法是,也许在使用模型时,我们只能在SelectList构造函数上设置选定的项,而不是使用viewdata (它工作得很好),并将选择列表与模型一起传递-这将有稍微清理代码的好处-我只是想知道为什么这个方法不能工作……

非常感谢您的建议

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-12-23 23:13:24

经过一番折腾之后,它可以归结为下面这行代码

代码语言:javascript
复制
if (ViewData.ModelState.TryGetValue(key, out modelState))

这意味着MVC试图通过只查看ViewData Dictionary<>对象而不是遍历到ViewData.Model对象来解析该值。

这是一个错误,限制还是设计决定,我不确定。但是,您可以通过以下方式进行修复:

代码语言:javascript
复制
<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>
票数 5
EN

Stack Overflow用户

发布于 2010-12-12 00:49:17

很明显我来晚了。但我想添加这条评论,以防其他人遇到这个问题。

在MVC 2中。您可以执行以下操作来选择项目...

代码语言:javascript
复制
public ActionResult Edit(int id)
        {
            Team team = _db.TeamSet.First(m => m.TeamID == id);
            var fanYear = from c in _db.FanYearSet select c;
            ViewData["FantasyYear"] = new SelectList(fanYear, "YearID", "FantasyYear", team.FanYearReference.EntityKey.EntityKeyValues[0].Value);
            var league = from c in _db.LeagueSet select c;
            ViewData["League"] = new SelectList(league, "LeagueID", "League_Name", team.LeaguesReference.EntityKey.EntityKeyValues[0].Value);

            return View(team);
        }

第四个参数接受一个值,并将在下拉列表中选择您想要的值。在我的示例中,我有一个名为team的表,它是一个与名为fanYear和联盟的表设置的关系。

你可以看到,我首先得到了我正在编辑的球队,然后建立了一个梦幻年份的下拉列表,并为联赛建立了另一个下拉列表。为了确定球队的年份和联盟,我必须使用实体引用。

只是想把这点公之于众。我找不到任何这样做的例子。

票数 2
EN

Stack Overflow用户

发布于 2009-10-27 20:05:25

好吧,我可能在这个线程中遗漏了一些东西,但是在C#中,下面的代码是有效的:

代码语言:javascript
复制
Html.DropDownList("ProfessionGuid", (SelectList)ViewData["Professions"])

其中'ProfessionGuid‘是要在列表中选择的值。

在VB.Net中,我认为应该是:

代码语言:javascript
复制
Html.DropDownList("ProfessionGuid", ViewData["Professions"] AS SelectList)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/390083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档