【问题标题】:Please Help, Unable to access the text in MVC dropdown list on POST请帮助,无法访问 POST 上 MVC 下拉列表中的文本
【发布时间】:2011-01-14 03:27:57
【问题描述】:

我有一个 MVC 下拉列表 (Html.DropDownList),其中填充了电影列表。我想在执行表单提交时同时检索标题(值字段)和描述(文本字段)。我可以访问标题(值字段),但无法访问描述。我的代码示例如下。

//查看模型.......

公开课影院

{

    public string CinemaName { get; set; }

    public SelectList MoviesList { get; set; }

    public string MoviesName { get; set; }

}

公开课电影

{

    public string Title { get; set; }

    public string Description { get; set; }

}

//控制器

[AcceptVerbs(HttpVerbs.Get)]

    public ActionResult Index()

    {

        Cinema _cinema = GetViewModel();

        ViewData.Model = _cinema;

        return View();

    }



    public IEnumerable<Movie> GetMovieList()

    {

        List<Movie> list = new List<Movie>();                        

        list.Add(new Movie(){ Title = "1", Description = "Batman" });

        list.Add(new Movie() { Title = "2", Description = "Metrix" });

        list.Add(new Movie() { Title = "3", Description = "Jaws" });

        return list;           

    }



    public Cinema GetViewModel()

    {

        var cinema = new Cinema();

        cinema.CinemaName = "Village";

        cinema.MoviesList = new SelectList(GetMovieList(), "Title", "Description", "Jaws");

        return cinema;

    }



    [AcceptVerbs(HttpVerbs.Post)]

    public ActionResult Update(Cinema _cinema)

    {

        //Here I need both value and the text  field from the selected item in the drop down

        string movieName = _cinema.MoviesName;

        return View();

  }

//查看

" %>

Home Page

<% using (Html.BeginForm("Update", "Home"))

   { %>

<p>

    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">

        http://asp.net/mvc</a>.

</p>

<%= Html.TextBox("CinemaName", Model.CinemaName)%>

<%= Html.DropDownList("MoviesName", Model.MoviesList)%>



<input type="submit" value="Submit" />

<% } Html.EndForm(); %>

} {

【问题讨论】:

    标签: asp.net-mvc drop-down-menu


    【解决方案1】:

    表单帖子仅发送选择列表的值。你不应该需要其他任何东西。你应该能够从值中得到你想要的。

    【讨论】:

      【解决方案2】:

      首先考虑一下为什么你也需要文本......

      从技术上讲,下拉 ID 应该足以识别控制器端的选项:)

      【讨论】:

        【解决方案3】:

        根据您在此线程中的一个答案...

        我需要文本,因为要在下一个视图中显示描述。此外,我不需要单独调用 db 来通过提供 Id 来获取文本字段。而且我也不想将列表存储在内存中以获取文本字段。有 Javascript 或 jQuery 解决方案吗?

        在我看来,您提到的这个“下一个视图”的控制器应该能够创建更新/新视图模型并将其返回到“下一个视图”。我个人认为随着未来的变化更容易审查和修改。

        您可以添加一个隐藏字段或文本框,以便在您的下拉列表更改时更改其文本属性。然后这个新字段也将被发布回您的控制器。


        如果由我决定,我的控制器将使用新视图所需的信息填充我的 ViewModel。在您请求信息时使用隐藏字段对我来说就像是代码味道。

        【讨论】:

          【解决方案4】:

          我需要文本,因为要在下一个视图中显示描述。此外,我不需要单独调用 db 来通过提供 Id 来获取文本字段。而且我也不想将列表存储在内存中以获取文本字段。有 Javascript 或 jQuery 解决方案吗?

          【讨论】:

          • 您可以将其发布在隐藏字段中。但是您中继应该从数据库中获取它。你想要的是不好的做法,它会在以后伤害你,而且性能方面的问题,无论如何从数据库中获取它可能会更好。如果您发布它,您将有更多的网络流量(尽管在这种情况下很少),这通常会对性能产生更大的影响,而不是小型数据库调用。而且,如果您从数据库中获取它,则无论如何您都应该访问缓存。我的建议:只发送 id 并从数据库中获取其余部分。
          【解决方案5】:

          我认为这样的事情要好得多。一口气,按照我需要的方式获取列表并在帖子中操作 FullName。

          公开课电影

           {  
          
                  public string Title { get; set; }  
          
                  public string Description { get; set; } 
                  public string FullName{ get{ return Title + "|" + Description; }} // instead of | you can put esc char or other char that does not easily find in title + description
          
           }  
          

          cinema.MoviesList = new SelectList(GetMovieList(), "Title", "FullName", "Jaws");

          【讨论】:

          • 好吧,这样你的控制器需要知道视图的样子(它不应该。这违反了模式)。你中继比只发布ID要好得多。你有什么不想要的理由?
          • 嗨 Mattias 我的答案提交如下。 “是的,同意。我想我稍微发布了错误的代码............”请让我知道你的想法。
          【解决方案6】:

          当然你可以这样做:

          $("#yourdropdownid option:selected").text();
          

          Original thread:)

          【讨论】:

            【解决方案7】:

            正如 Mattias Jakobson 所说,您只能在发送表单时访问所选内容的 Value 属性。如果您真的需要标签和值,一种快速而肮脏的方法是在 Value 属性中用 : 分隔两个值,类似于然后执行 string.split。

            在回答了您的问题后,我建议您重新考虑您的方法并尝试将整个域对象从控制器中的选定选项中取出(传递 id 将是理想的解决方案)。

            【讨论】:

              【解决方案8】:

              是的,同意。我想我稍微发布了错误的代码。 我猜正确的代码是

              cinema.MoviesList = new SelectList(GetMovieList(), "FullName", "Description", "Jaws");
              
              class Movie
              {  
              
                      public string Title { get; set; }  
              
                      public string Description { get; set; } 
                      public string FullName{ get{ return Title + "|" + Description; }} // instead of | you can put esc char or other char that does not easily find in title + description
              
               }
              

              你看这里原来的标题现在充当全名(标题+“|”+描述),描述是我们在视图中显示的内容。

              <%= Html.DropDownList("Description", Model.MoviesList)%>
              

              所以控制器不知道视图的样子。在控制器中只对 ID 进行操作,以便在发布期间轻松获取描述。让我知道我是否仍然错了?

              我解释的只是另一种选择。你是对的,我认为最好的解决方案是调用带有 ID 的数据库来获取回发的描述

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-27
                • 2020-02-09
                • 1970-01-01
                • 2012-01-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多