繁体   English   中英

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

[英]pass selected dropdown list value from View to Controller

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

在视图中:

    @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 = "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<SelectListItem> GetEmails()
    {
        return emails;
    }

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

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

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

你没有为我提供足够的上下文来分析错误,但我的猜测是@Html.DropDownList("Emails", Model.GetEmails())正在生成类似<select name="Emails"> ....</select> 这意味着当模型绑定发生时,它正在寻找提交的“电子邮件”输入,但什么也没找到。 而是尝试使用@Html.DropDownList("email", Model.GetEmails())来使其工作。

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

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

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM