将选定的下拉列表值从视图传递到控制器

2024-04-27

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

在视图中:

    @using (Html.BeginForm("Send", "Overview", FormMethod.Get))
    {
        <p>Email: @Html.DropDownList("Emails", Model.GetEmails())
        <input type="submit" value="Send" />
        </p>

    }

在控制器中:

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

在概述模型中:

    private List<SelectListItem> emails;
    ...
    public Overview()
    {
        emails = new List<SelectListItem>();
        emails.Add(new SelectListItem() { Text = "[email protected] /cdn-cgi/l/email-protection", Value = "[email protected] /cdn-cgi/l/email-protection", Selected = true });
        emails.Add(new SelectListItem() { Text = "[email protected] /cdn-cgi/l/email-protection", Value = "[email protected] /cdn-cgi/l/email-protection", Selected = false });
        emails.Add(new SelectListItem() { Text = "[email protected] /cdn-cgi/l/email-protection", Value = "[email protected] /cdn-cgi/l/email-protection", Selected = false });
    }
    ...
    public List<SelectListItem> GetEmails()
    {
        return emails;
    }

你能帮我完成这项工作吗?我缺少什么? (顺便说一句,请不要介意控制器现在返回 null :))。


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

  • 您的浏览器请求/MyApp/Overview从您的服务器 (IIS)
  • IIS 接收它并将其发送到 Asp.Net
  • Asp.Net Mvc看到请求并通过routing发现你想打电话给Overview方法上的MyAppController class
  • 该方法运行并生成一个模型
  • Asp.Net Mvc 将模型传递给视图引擎,视图引擎运行视图以生成 html
  • html 返回到 IIS,然后将其发送到您的浏览器
  • 您的浏览器将 html 显示为选择控件。
  • 用户做出选择并单击表单上的“提交”
  • 浏览器对它们的提交进行编码,并将其发送到表单的 action 属性中的 url(例如<form method=POST action="/MyApp/Send>)
  • IIS 获取该信息并将其发送到 Asp.Net
  • Asp.Net Mvc看到请求并通过routing发现你想打电话给Send方法上的MyAppController class
  • Asp.Net Mvc 发现您的方法需要一个名为的字符串参数email并尝试使用以下方法在提交的表单数据中查找此信息模型绑定
  • Asp.Net Mvc 调用Send具有找到的参数值的方法(如果可用)
  • ...

您没有提供足够的背景信息让我能够分析问题所在,但我的猜测是@Html.DropDownList("Emails", Model.GetEmails())正在生成类似的东西<select name="Emails"> ....</select>。这意味着当模型绑定发生时,它正在寻找提交的“电子邮件”输入,但什么也没找到。相反尝试类似的东西@Html.DropDownList("email", Model.GetEmails())让它发挥作用。

从语义上讲,这无论如何都是更正确的,因为虽然控件displays电子邮件(复数),实际上是一个用户相互作用通过选择电子邮件(单数)来使用它。将其视为只是一个文本框,您不会以复数形式命名它。

顺便说一句,我应该指出,你有几个HUGE这里有安全漏洞。通过将电子邮件地址作为方法的输入,似乎任何人都可以在浏览器中打开开发人员工具并使用您的服务向any电子邮件地址!垃圾邮件发送者喜欢寻找这样的不安全服务。更好的解决方案是让生成的选择列表中的值成为您想要通过电子邮件发送的用户的 ID,并在Send方法将 id 作为输入。还,Send绝对不应该通过 Http GET 访问(所以在上面放一个 [HttpPost] 属性!)。如果它允许 GET,即使这是在登录页面后面,我也可以欺骗登录的用户访问带有以下内容的表单:<img src="http://yoursite.com/MyApp/Send/[email protected] /cdn-cgi/l/email-protection" />每次他们访问该页面时,都会有人收到垃圾邮件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将选定的下拉列表值从视图传递到控制器 的相关文章

随机推荐