2015-08-26 7 views
1

Я читал сообщения за два дня по этому поводу и до сих пор не понял ответа. Я хочу захватить выбор DropDownList в моем ModelView, передав его в @ Html.ActionLink, который вернет его к определенному действию в контроллере.Pass @ Html.DropDownList выбор с использованием @ Html.ActionLink с ViewModel для контроллера

Мои ViewModel:

public class ViewModelShipments 
    { 
     public ViewModelShipments() 
     { 
      tblShipments = new tblShipments(); 
     } 
     public tblShipments tblShipments; 
     public IEnumerable<SelectListItem> ShipmentIDsList; 
     public string SelectedShipmentID; 
    } 

Мой контроллер:

public ActionResult SelShipment(string SelectedShipmentID)//for ShipmentID change via DropDownList 
     { 
      int id = db.tblShipments.Max(p => p.ShipmentID); // find last ShipmentID 
      if (SelectedShipmentID != null) 
      { 
       id = Int32.Parse(SelectedShipmentID);//convert text to int 
      } 

Мой Вид:

  @Html.DropDownListFor(expression: model=>model.SelectedShipmentID,selectList: Model.ShipmentIDsList) @* render DropDownList object*@ 
      @Model.SelectedShipmentID @* display value of SelectedShipmentID *@ 

      <!-- Upon Click, send selected ID to controller --> 
      <!-- the ActionLink is working, but the routeValues: always contain NULL --> 
      @Html.ActionLink(linkText: "Submit", actionName: "SelShipment", controllerName: "Shipment", routeValues: Model.SelectedShipmentID, htmlAttributes: null) 

Почему ActionLink (..., routeValues: Model.SelectedShipmentID ,. ..) всегда возвращают NULL в контроллер? Model.SelectedShipmentID не обновляется с выбранным идентификатором DropDownList. Пожалуйста, помогите, поскольку у меня заканчивается время.

+0

Вам нужно javascript/jquery, чтобы изменить URL-адрес ссылки на основе выбранного значения или лучше разместить значение с помощью формы (может быть 'FormMethod.Get'). И причина, по которой его ошибка, заключается в том, что код Razor оценивается на сервере до его отправки клиенту, поэтому добавленное значение маршрута является начальным значением «Model.SelectedShipmentID» (оно не изменяется только потому, что вы выбираете что-то в своем UI –

+0

И поскольку 'ShipmentID' является typeof' int', ваш параметр метода и свойство модели должны быть 'int? SelectedShipmentID' (не' string') –

+0

Спасибо за быстрые ответы. Я работаю над настройками. Удалось восстановить SelectedShipmentID POST'ing формы обратно к контроллеру. С 60 полями в форме я буду смотреть на предложение Стивена ниже использования Ajax и частичных представлений, чтобы свести к минимуму ненужный обмен данными. Это было первоначальное намерение использовать ActionLink. много учиться ... так мало времени. –

ответ

1

Код бритвы разобран на сервере перед его отправкой на просмотр, поэтому значение параметра вашего маршрута будет начальным значением SelectedShipmentID. Выбор значения из выпадающего списка не изменяет URL, который вы уже отобрали.

Вы можете использовать JavaScript/JQuery для обработки .change() события в DropDownList (или на ссылки .click() события), чтобы обновить URL, однако лучший способ справиться с этим, используя форму, что делает GET для вашего метода контроллера

@model ViewModelShipments 
@using (Html.BeginForm("SelShipment", "Shipment", FormMethod.Get)) 
{ 
    @Html.DropDownListFor(m => m.SelectedShipmentID, Model.ShipmentIDsList, "-Please select-") 
    <input type="submit" /> 
} 

Обратите внимание на последний параметр DropDownListFor() добавить опцию метки позволяет отправлять обратно null, но не уверен, если это подходит для вас.

Поскольку ваша привязка к значению int, то и ваш параметр модели и метода модели должен быть int? не string. Кроме того, вы должны изменить логику в контроллере, чтобы вы не делали ненужные вызовы базы данных, когда действительное значение передается методу.

public ActionResult SelShipment(int? SelectedShipmentID) 
{ 
    if (!SelectedShipmentID.HasValue) 
    { 
    // only necessary to call database if SelectedShipmentID is null 
    SelectedShipmentID = db.tblShipments.Max(p => p.ShipmentID) 
    } 
    .... 
} 

Side Примечание: Из ваших свойств модели представления, я предполагаю, что вы желая показать некоторые данные в представлении на основе значения выбранного ShipmentID. Если это так, вы должны рассмотреть возможность использования ajax для размещения выбранного значения в методе контроллера, который возвращает данные tblShipments на основе значения, либо как частичное представление, либо как json, и обновляет текущую страницу, а не выполняет полное обновление страницы каждый раз ,