1

我需要将多个数据(可能是 2 个 Html.DropDownList 的选定值)从 MVC 视图(.aspx)传递给 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') 有一些无效参数”。

希望现在它会清楚,仍然模棱两可,然后让我知道。

问候乌斯曼

4

2 回答 2

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。这打破了下拉自动获取数据的行为,因此您必须明确指定数据列表。

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

编辑2:

根据您上面的代码:

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

这就是你所需要的

如果你刚刚给我们这个,并且没有争论,这会更容易解决。

于 2012-04-08T23:30:34.867 回答
1
    // 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.
于 2012-04-09T16:27:09.083 回答