2014-01-12 4 views
4

Я хочу передать параметр (строку) моему контроллеру из моего представления. Значение должно быть таким, которое выбрано из раскрывающегося списка в представлении. Метод вызывается после нажатия кнопки, но в контроллере параметр всегда равен нулю.передать выбранное выпадающее меню из View to Controller

В Вид:

@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]", Value = "[email protected]", Selected = true }); 
     emails.Add(new SelectListItem() { Text = "[email protected]", Value = "[email protected]", Selected = false }); 
     emails.Add(new SelectListItem() { Text = "[email protected]", Value = "[email protected]", Selected = false }); 
    } 
    ... 
    public List<SelectListItem> GetEmails() 
    { 
     return emails; 
    } 

Не могли бы вы помочь мне получить эту работу? Что мне не хватает? (Кстати, не обращай внимания на контроллер, возвращающий нуль, пожалуйста, пожалуйста :)).

+0

Это, казалось, исправить, в Контроллере: string email2 = Request.Form ["Emails"]; – user3147607

+0

Почему 'GetEmails()' public и зачем возвращать 'List <>'? оба они выглядят подозрительно, как анти-шаблоны –

ответ

5

Вы можете просто использовать строку в вашей модели,

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

Что делать, если у вас есть 2 dropdownlists, и вы должны проверить, какой из них выбрал один пользователь, а какой нет? – Jogi

+0

Эта же концепция по-прежнему применяется там, просто установите значение «по умолчанию» в вашем «List » перед отправкой его на ваш просмотр. Вы можете это сделать, установив для свойства 'Selected' элемента значение' true' (OP делает это выше). Если ваше значение по умолчанию все еще выбрано на модели к моменту вашего POST, вы можете предположить, что пользователь ничего не выбрал из этого конкретного раскрывающегося списка. – X3074861X

7

Из вашей терминологии я предполагаю, что вы смущены тем, что происходит. Вы никогда не отправляете ничего из представления на контроллер. Вместо этого представление - это то, что собирает 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]" />, и каждый раз, когда они посещают страницу, кто-то будет получать спам-адрес электронной почты.

+0

Nice. И да, int лучше передать, чем строковое письмо. – JoshYates1980

Смежные вопросы