2014-09-07 7 views
1

Я пытаюсь получить выбранное значение выпадающего списка в @ Html.ActionLink, но пока не повезло. Требование состоит в том, чтобы динамически извлекать таблицу и иметь раскрывающийся список для действий, которые могут быть предприняты против строки. Мне нужно выбрать действие, а затем нажать кнопку отправки, идентификатор строки и выбранное значение действия должны быть отправлены на контроллер. Вот фрагмент кода, который у меня есть.Получить выбранное значение Dropdownlist в ActionLink (MVC 5)

@foreach (AdsViewModel ad in Model) 
{ 
    <tbody> 
    <tr> 

     <td>@ad.Row_Id</td> 
     <td class=" "> @ad.Description </td> 
     <td class=" "> @ad.Valid_To.ToShortDateString() </td> 
     <td><span class="label label-sm label-success label-mini"> @ad.Status </span></td> 
     <td>@Html.DropDownList("actions", ad.Actions) </td> 
     <td>@Html.ActionLink("Submit", "AdAction", new {adId = ad.Row_Id, action = ad.Actions.SelectedValue}) </td> 
    </tr> 
    </tbody> 

}

При нажатии на Submit ActionLink, я получаю Адид но никаких действий не возвращается из DropDownList.

Ваша помощь очень ценится. Edit: Вот AdsViewModel

public class AdsViewModel 
{ 
    public string Row_Id { get; set; } //Transaction Number 
    public string Description { get; set; } //Trasaction Description 
    public DateTime Valid_To { get; set; } //Expiry 
    public string Status { get; set; } //Object Status Code 
    public SelectList Actions { get; set; } 
} 

Это, как выбрать список заполняется в контроллере

List<SelectListItem> items = new List<SelectListItem>(); 
items.Add(new SelectListItem() { Text = "View", Value = "001" }); 
items.Add(new SelectListItem(){Text = "Modify", Value = "002"}); 
model.Actions = items; 

ответ

0

Это должно исправить ...

@for (int i = 0; i < Model.Count(); i++) 
{ 
    var ad = Model[i]; 
    <tbody> 
     <tr> 
      <td>@ad.Row_Id</td> 
      <td class=" "> @ad.Description </td> 
      <td class=" "> @ad.Valid_To.ToShortDateString() </td> 
      <td><span class="label label-sm label-success label-mini"> @ad.Status </span></td> 
      <td>@Html.DropDownListFor("actions", m => m[i].Actions) </td> 
      <td>@Html.ActionLink("Submit", "AdAction", new {adId = ad.Row_Id, action = ad.Actions.SelectedValue}) </td> 
     </tr> 
    </tbody> 
} 
+0

Ну, ad.Actions является выпадающим списком и содержит несколько значений. Он по-прежнему просто не извлекает выбранное значение выпадающего списка. –

+0

Не могли бы вы обновить свой вопрос классом, который вы используете для своей модели и AdsViewModel. –

+0

Обновлено, см. Редактировать. –

3

Эта линия

<td>@Html.ActionLink("Submit", "AdAction", new {adId = ad.Row_Id, action = ad.Actions.SelectedValue}) </td> 

устанавливает значение маршрута action выбранному значению на момент создания представления на сервере и перед его отправкой в ​​браузер (пользователь еще ничего не выбрал, поэтому его значение равно null). Если вы хотите установить значение «001» или «002» (значения выпадающих списков), вам необходимо использовать обновление javascript атрибута href ссылки при изменении раскрывающегося списка. Более простым и более обычным решением было бы удалить выпадающий список и использовать 2 ссылки действий, одну для View и одну для Edit. Поскольку они представляют собой два разных действия, в вашем контроллере также должны быть два отдельных метода ActionResult. Например

@Html.ActionLink("View", "View", new { id = ad.Row_Id }) // calls the View method 
@Html.ActionLink("Modify", "Modify", new { id = ad.Row_Id }) // calls the Modify method 

Редактировать

Чтобы сделать это с помощью JavaScript, удалите @Html.ActionLink и замените <button type="button"> или другого элемента и обрабатывать его click событие

var url = '@Url.Action("AdAction")'; 
$('button').click(function() { 
    var row = $(this).closest('tr'); 
    var rowID = row.children('td').eq(0).text(); 
    var actionID = row.find('select').val(); 
    window.location.href = url + '?adId=' + rowID + '&action=' + actionID; 
}); 

Примечание: Вы создаете недействительный html с методом @Html.DropDownList() (все <selects> будет иметь id="action")

+0

Поскольку раскрывающийся список действий заполняется во время выполнения и может содержать более одного значения, я не могу дать все действия в своем представлении.Можете ли вы написать Javascript для меня, чтобы, когда я нажимаю кнопку отправки, он выбирает значение Row_ID и выбранное значение ddl действия и отправляет его методу AdAction Action? –

+0

@AdilKhalil, см. Отредактированный ответ. –

+0

Спасибо @Stephen, ваше решение выглядит убедительно. Можете ли вы написать точную часть кода, я знаю, что это очень просто, но я совершенно не знаком с веб-разработкой и не могу понять это сам. –

-1

Спасибо. Все, я решил это, написав функцию Javascript и вызвав эту функцию в событии onClink кнопки.

<script type="text/javascript" language="javascript"> 
     function ShowEditData() { 
      var url = '@Url.Action("AdAction")'; 

      var rows = document.getElementById("mytable").rows; 
      for (var i = 0, ceiling = rows.length; i < ceiling; i++) { 
       rows[i].onclick = function() { 
        debugger; 
        var Row_Id = this.cells[0].innerHTML; 
        var actionID = this.cells[4].childNodes[0].value; 
        window.location.href = url + '?row_id=' + Row_Id + '&action_id=' + actionID; 
       } 
      } 

     } 
</script> 
Смежные вопросы