Из вашей терминологии я предполагаю, что вы смущены тем, что происходит. Вы никогда не отправляете ничего из представления на контроллер. Вместо этого представление - это то, что собирает Html для отправки в веб-браузер. Так что же на самом деле происходит это:
- Ваш браузер запрашивает
/MyApp/Overview
с сервера (IIS)
- IIS поднимает его и передает, что в Asp.Net
- Asp.Net Mvc видит запрос и через маршрутизации выясняет, что вы хотите, чтобы вызвать метод
Overview
на MyAppController
класса
- прогонов метода и производит модель
- Asp.Net Mvc передает модель в виде двигатель, который работает ваш просмотр для производства html
- html возвращается в IIS, который отправляет его в ваш браузер
- Ваш браузер показывает html как элемент управления.
- Пользователь делает выбор и щелкает «представить» на форме
- Браузер кодирует их представления и отправляет его на URL в атрибуте действия формы (например
<form method=POST action="/MyApp/Send>
)
- IIS выбирает, что и посылает его Asp.Net
- Asp.Net Mvc видит запрос и через маршрутизации цифры, что вы хотите, чтобы вызвать
Send
метод на MyAppController
класса
- Asp.Net Mvc видит, что ваш метод ожидает параметр строки с именем
email
и пытается найти эту информацию в представленных данных формы с использованием модели связывания
- ASP.Net MVC вызывающую
Send
метод с найденным значением параметра (если таковые имеются)
- ...
Вы не обеспечивают достаточно контекста для меня, чтобы быть в состоянии проанализировать, что это неправильно, но я думаю, что @Html.DropDownList("Emails", Model.GetEmails())
порождает нечто вроде <select name="Emails"> ....</select>
. Это означает, что когда происходит привязка к модели, она ищет входной адрес электронной почты, но ничего не находит. Вместо этого попробуйте что-то вроде @Html.DropDownList("email", Model.GetEmails())
, чтобы заставить его работать.
Семантически это более правильно в любом случае, потому что в то время как у контрольных дисплеев электронной почты (множественное число), пользователь фактически взаимодействует с ним, выбрав по электронной почте (в единственном числе). Думайте об этом, как будто это всего лишь текстовое поле, вы не назовете это во множественном числе.
Следует отметить, что у вас есть несколько HUGE дыры безопасности здесь. Принимая адрес электронной почты как ввод в свой метод, кажется, что любой может открыть инструменты разработчика в своем браузере и использовать ваш сервис для отправки электронных сообщений на адрес любого адреса электронной почты! Спамеры любят найти необеспеченные услуги, подобные этому. Лучшим решением было бы иметь значение в сгенерированном списке выбора как идентификатор для пользователя, которого вы хотите отправить по электронной почте, а в методе Send
принять идентификатор в качестве входного. Кроме того, Send
не должно быть доступно через Http GET (поэтому поставьте здесь атрибут [HttpPost]!). Если он разрешает GET, даже если это за страницей входа в систему, я могу обмануть пользователей, которые вошли в систему, с помощью <img src="http://yoursite.com/MyApp/Send/[email protected]" />
, и каждый раз, когда они посещают страницу, кто-то будет получать спам-адрес электронной почты.
Это, казалось, исправить, в Контроллере: string email2 = Request.Form ["Emails"]; – user3147607
Почему 'GetEmails()' public и зачем возвращать 'List <>'? оба они выглядят подозрительно, как анти-шаблоны –