将选定的下拉列表值从View传递到Controller

我想从我的View中将参数(字符串)传递给我的Controller。 该值应该是从视图中的下拉列表中选择的值。 按钮单击后调用该方法,但在Controller中,参数始终为null。

在视图中:

@using (Html.BeginForm("Send", "Overview", FormMethod.Get)) { 

Email: @Html.DropDownList("Emails", Model.GetEmails())

}

在控制器中:

  public ActionResult Send(string email) { // email is always null! return null; } 

在概述模型中:

  private List emails; ... public Overview() { emails = new List(); emails.Add(new SelectListItem() { Text = "a@b.com", Value = "a@b.com", Selected = true }); emails.Add(new SelectListItem() { Text = "b@c.com", Value = "b@c.com", Selected = false }); emails.Add(new SelectListItem() { Text = "c@d.com", Value = "c@d.com", Selected = false }); } ... public List GetEmails() { return emails; } 

你能帮我解决这个问题吗? 我错过了什么? (顺便说一句,不要介意控制器现在返回null请:))。

你可以在你的模型中使用一个字符串,

 public string emails { get; set; }; 

然后在你的视图上使用DropDownListFor

 @Html.DropDownListFor(x => x.emails, Model.GetEmails()) 

并在POST上直接从模型中获取值。

 [HttpPost] public ActionResult Send(OverviewViewModel overviewModel) { //here is the value from the drop down var theEmail = overviewModel.emails; } 

根据你的术语,我猜你对所发生的事情感到困惑。 您永远不会从视图向控制器发送任何内容。 相反,视图是组装Html以发送到Web浏览器的东西。 那么实际发生的是:

  • 您的浏览器从您的服务器(IIS)请求/MyApp/Overview
  • IIS选择它并将其发送给Asp.Net
  • Asp.Net Mvc看到了请求并通过路由数据表明你想在MyAppController类上调用Overview方法
  • 该方法运行并生成模型
  • Asp.Net Mvc将模型传递给视图引擎,该引擎运行您的视图以生成html
  • 将html返回给IIS,将其发送到您的浏览器
  • 您的浏览器将html显示为选择控件。
  • 用户进行选择并单击表单上的“提交”
  • 浏览器对其提交进行编码,并将其发送到表单的action属性中的url(例如
    正在产生类似 。 这意味着当模型绑定发生时,它正在寻找提交的“电子邮件”输入,但什么也没找到。 而是尝试使用@Html.DropDownList("email", Model.GetEmails())来使其工作。

    从语义上讲,这更加正确,因为当控件显示电子邮件(复数)时,用户实际上通过选择电子邮件(单数) 与其进行交互 。 可以把它想象成只是一个文本框,你不会用复数forms命名。

    顺便提一下,我应该注意到,你在这里有几个巨大的安全漏洞。 通过将电子邮件地址作为输入到您的方法中,似乎任何人都可以在他们的浏览器中打开开发人员工具并使用您的服务向任何电子邮件地址发送电子邮件! 垃圾邮件发送者喜欢找到这样的不安全服务。 一个更好的解决方案是让生成的选择列表中的值为您想要通过电子邮件发送的用户的ID,并在Send方法中将id作为输入。 另外,绝对不能通过Http GET访问Send (所以在那里加上[HttpPost]属性!)。 如果它允许GET,即使它在登录页面后面,我也可以欺骗登录的用户访问带有表单每次访问该页面时,都会有人收到垃圾邮件。