如何将多个 Html.DropDownList 选定值从 View(.aspx) 传递给 MVC 控制器的操作?

Posted

技术标签:

【中文标题】如何将多个 Html.DropDownList 选定值从 View(.aspx) 传递给 MVC 控制器的操作?【英文标题】:How to pass multiple Html.DropDownList selected values from View( .aspx ) to MVC controller's action? 【发布时间】:2012-04-08 22:22:11 【问题描述】:

我需要从 MVC 视图 (.aspx) 将多个数据(可能是 2 个 html.DropDownList 的选定值)传递给 MVC 控制器操作方法。我认为它会以某种方式来自 Html.Hidden 形式,但如何?

我无法从 Html.DropDownList 中获取选定的值并将其作为 Html.Hidden("paramName", MvcStringSelectedValue) 传递给控制器​​的操作。

我的代码是:

        based on<br />

        <%: Html.DropDownList("Semester")%>
        <%= Html.Hidden("strSemesterToBaseOn",returnedValueFromAbove)%>

        <%: Html.ValidationSummary(true) %>           
        <input type="submit" value="Clone" />

    <%  %>
<br/><br/>

“提交”的输入标签需要写2次还是只写一次?

编辑(额外代码)

控制器的动作方法:

[HttpPost]
public ActionResult CloneSemesterData(string strSemesterToOrganize, string strSemesterToBaseOn)


     .............................................................
     ..............................      

这里(另一个控制器的方法)是填满学期值的下拉列表

   public ActionResult DepartmentAdministration()
   
      // Get list of semesters
      var lr = new ListRepository();
      ViewData["Semester"] = new SelectList(lr.ListSemester(3));  //this ListSemester(3) will generate the list with 3 strings ( e.g "WS 2012", "SS2010")

      return View();
   

我在 .aspx 文件中的查看代码是:

//当radioButton ="Clone"被选中时执行

    <% using (Html.BeginForm("CloneSemesterData", "CourseNeededHours")) 
    %>
        <%= Html.DropDownList("Semester")%> // this is First drop down list box , from which selected value , I want to transfer as 1st parameter of controller's action method

        <%: Html.ValidationSummary(true) %>           

        based On 

        <%= Html.DropDownList("Semester")%> //this is Second drop down list box, from which selected value, I want to transfer as 2nd parameter of controller's action method.
          <input type="submit" value="Clone" />

    <%  %>

错误:

现在,在使用 Edit 2 修复后:它在

下给出红线

因为它无法识别 ViewData["SemesterList"]...

“System.Web.Mvc.HtmlHelper 不包含 'DropDownList' 的定义和重载的最佳扩展方法 'System.Web.Mvc.Html.SelectExtensions.DropDownList(System.Web.Mvc.HtmlHelper, string,System.Collections. Generic.IEnumerable') 有一些无效参数”。

希望现在它会清楚,仍然模棱两可,到时请告诉我。

问候 乌斯曼

【问题讨论】:

请发布您需要在单击提交后调用的控制器操作以及填充您的 DropDownLists 的控制器...这样我们可以看到并纠正您在做什么;) 【参考方案1】:

我不确定你在这里问什么。您不需要任何类型的隐藏字段来发布下拉列表的选定值。您的下拉列表代码一开始就无效。

通常你有这样的东西:

<%= Html.DropDownList("SemesterToOrganize", GetSemesterToOrganize()) %>
<%= Html.DropDownList("SemesterToBaseOn", GetSemesterToBaseOn()) %>

在你的控制器中:

[HttpPost]
public ActionResult MyAction(string SemesterToOrganize, string SemesterToBaseOn) 
    // your code.

编辑:

根据您告诉我们的内容。您依赖 MVC 填充 DropDownList 的行为,因为您将列表添加到与下拉列表同名的 ViewData。这对你不起作用。您必须分别填充每个下拉列表。

在您的控制器中,执行以下操作:

public ActionResult MyAction ()

    ViewData["SemesterList"] = // list of semesters

    return View();

那么,在你看来,你有:

<%= Html.DropDownList("SemesterToOrganize", ViewData["SemesterList"]) %> 
<%= Html.DropDownList("SemesterToBaseOn", ViewData["SemesterList"]) %> 

然后是你的发布方法

[HttpPost] 
public ActionResult MyAction(string SemesterToOrganize, string SemesterToBaseOn)  
    // your code. 
 

如果你想继续争辩说你可以按照自己的方式去做,那你就解决不了问题。每个下拉菜单都必须有自己的唯一 ID,否则将无法正确发布。解决这个问题的唯一方法是给每个它自己的唯一 ID。这会破坏下拉菜单自动获取数据的行为,因此您必须明确指定数据列表。

所以不要再争论这是问题的一个不重要的部分。它不是。这是问题的关键。

EDIT2:

根据您上面的代码:

<%= Html.DropDownList("strSemesterToOrganize", (SelectList)ViewData["Semester"]) %>
<%= Html.DropDownList("strSemesterToBaseOn", (SelectList)ViewData["Semester"]) %>

这就是你所需要的

如果你只是给我们这个,而不是争论,这会更容易解决。

【讨论】:

实际上我已经有一个填充的 Html.DropDownList smesters ("SS2012,WS2013, SS2011") 和其他 Html.DroopDownList 相同的值,我只想从两个列表中获取选定的值并将它们作为控制器动作的参数发送。就是这样!! @Usman - 你没有任何意义。在创建下拉列表之前,您无法填写它们。您使用上面的代码创建它们。当您提交表单时,他们会自动发布他们选择的值。鉴于您显示的代码,您所描述的内容是不可能的。 @Usman - 我建议你提供真实的代码,而不是一些虚构的代码,因为你提供的代码是无效的,并且没有显示你真正想要做什么。使用真实代码。 这个 DropDownList 以某种方式通过一些基于 List 的列表填充到控制器的方法中,该列表已被填充(例如 listofSemester.Add("WS2012") 之类的......)只是忘记它。当只传递一个参数时,这会发布正确的值。但我需要通过 2 个列表的选择值来处理它,这 2 个列表必须以某种方式将它们选择的值提供给控制器的操作方法 @Usman - 您要求忘记对解决问题至关重要的事情。如果您不希望得到建议,那么您将无法解决问题。你的问题是你依赖一些在你的情况下不起作用的行为,但你不想改变它。【参考方案2】:
    // Try this. Change names and put in the appropriate namespace. 
    //Your view
    @model MvcApplication2.Models.CloneSemesterDataViewModel 
    @Html.LabelFor(x => x.SemesterToOrganize)
    @Html.DropDownListFor(x => x.SemesterToOrganize, Model.ListofSemestersToOrganize)
    --------
    @Html.LabelFor(x => x.SemesterToBaseOn)
    @Html.DropDownListFor(x => x.SemesterToBaseOn, Model.ListofSemestersToBaseOn)

    //view model
    namespace MvcApplication2.Models
    
        public class CloneSemesterDataViewModel
        
            public string SemesterToOrganize  get; set; 
            public IEnumerable<SelectListItem> ListofSemestersToOrganize
            
                get
                
                    return new List<SelectListItem>  new SelectListItem  Text = "SS2012" , Value = "SS2012" ;
                
            

            public string SemesterToBaseOn  get; set; 
            public IEnumerable<SelectListItem> ListofSemestersToBaseOn
            
                get
                
                    return new List<SelectListItem>  new SelectListItem  Text = "SS2012", Value = "SS2012"  ;
                
            
        
    


    ----------
    Controller.

    [HttpPost]
    public ActionResult CloneSemesterData(CloneSemesterDataViewModel viewModel)
    
       //viewModel.SemesterToBaseOn
       //viewModel.SemesterToOrganize
    

   // This should do the trick.

【讨论】:

视图是为 Razor 编写的。我想它可以直接转换为 aspx。 嗨,我如何将下拉列表的选定值显示到 webgrid 中?

以上是关于如何将多个 Html.DropDownList 选定值从 View(.aspx) 传递给 MVC 控制器的操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 asp.net mvc Html.DropDownList 帮助器将自定义项添加到下拉列表的顶部?

如何通过手动赋值来使用@Html.DropDownList? [复制]

Html.DropDownList - 如何添加额外的 <option> 到列表

将 Html.DropDownList 的选定值传递给控制器

如何在 html-page 中使用 Dropdownlist 更改选择?

将当前值的 html.dropdownlist 传递给 Actionlink?