2017-01-10 2 views
0

У меня есть следующие методы действия:Передача данных между методами действий ASP.NET

[HttpGet] 
    public ActionResult DBLookupIndex(DBLookupDTO dto) 
    { 
     dto.Areas = _ph.GetProfiles(); 
     return View(dto); 
    } 

    [HttpGet] 
    public ActionResult Search(DBLookupDTO dto) 
    { 
     dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId); 
     return RedirectToAction("DBLookupIndex", dto); 
    } 

Простой пользователь вводит действительную информацию в одну или несколько текстовых полей на веб-странице, и передает его в контроллер, нажав Отправить. Затем это вызывает Поиск -action. Отладка, я определил, что функция работает. Он находит то, что должен, но не передается, когда перенаправляет обратно на DBLookupIndex -action.

Мой вопрос: Что я делаю неправильно? Я видел примеры кода, аналогичные приведенным выше, как решения для подобных проблем, но по какой-то причине это не работает для меня.

EDIT:

я понял, после того, как пришел первый ответ, что мне не хватает какой-то информации. Всякий раз, когда страница загружается, она должна обновлять раскрывающееся меню, которое отображается в представлении, в случае добавления новых профилей/областей. Я делаю это с бритвой:

 <select name="AreaId" asp-for="AreaId" class="form-control"> 
     <option disabled selected value=""> -- Vælg et område -- </option> 
     @foreach (var a in Model.Areas) 
     { 
      <option value="@a.ProfileId">@a.Name</option> 
     } 

Вот почему я должен использоваться RedirectToAction, вместо того, чтобы новое действие оказывают такое же мнение. Разве есть лучший способ сделать это? :)

Заранее благодарим за любую помощь!

ответ

0

Вдобавок к ответу Peter B, другой вариант, чтобы сохранить его в TempData объект, который существует на вашем базовом контроллере.

[HttpGet] 
public ActionResult Search(DBLookupDTO dto) 
{ 
    var orders = new List<Order>(); 

    TempData["orders"] = orders; 
    return RedirectToAction("DBLookupIndex", dto); 
} 

Вы можете retieve данные на следующий запрос следующим образом:

[HttpGet] 
public ActionResult DBLookupIndex(DBLookupDTO dto) 
{ 
    var yourData = (List<Order>)TempData["orders"]; 
    ... 
    return View(dto); 
} 

Объект TempData существует для одного запроса и затем прояснилось. Вы можете read more about it here.

+0

Теоретически это похоже на путь, но проблема в том, что мой метод GetOrder() возвращает список (список заказов). Я быстро пытаюсь Google, но не смог найти решение этой проблемы (по крайней мере, я не мог понять с моим текущим уровнем навыков программирования). Может, у вас есть предложение? Спасибо, что помог btw! –

+0

Вы должны просто иметь возможность хранить объект напрямую, а затем бросать его на выход (см. Мой обновленный ответ). В качестве альтернативы вы можете сериализовать/десериализировать его в/из JSON, как предложено [здесь] (http://stackoverflow.com/questions/34638823/store-complex-object-in-tempdata-in-mvc-6) –

+1

Спасибо большое за Помогите! ... и спасибо за ссылки. Я никогда не использовал TempData раньше, потому что я не знал, как правильно его использовать, но теперь я больше понимаю, как это работает. И вы, и Питер пришли с твердыми (и работающими) решениями моей проблемы, поэтому я попытаюсь выяснить, какой из них я буду использовать. Спасибо, что нашли время, чтобы помочь мне :) –

0

Параметр объекта в RedirectToAction предназначен для установки значений запроса для URL-адреса, который сгенерирован, а затем отправлен в браузер как результат «Перенаправление на другую страницу». Предполагается, что это объект, похожий на new { id = 7, otherParam = 5 }, или словарь, но, разумеется, не набор записей или какие-либо другие бизнес-данные.

Похоже, вы хотите показать представление, относящееся к действию DBLookupIndex. Это может быть сделано в очень простой способ, как это:

[HttpGet] 
public ActionResult Search(DBLookupDTO dto) 
{ 
    dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId); 
    return View("DBLookupIndex", dto); // Render the "DBLookupIndex" view and pass it the dto object 
} 

Update: если вам нужно dto.Areas быть всегда установлен, вы можете создать метод, который просто делает это.

Как это (1):

[HttpGet] 
public ActionResult DBLookupIndex(DBLookupDTO dto) 
{ 
    SetAreas(dto); 
    return View(dto); 
} 

[HttpGet] 
public ActionResult Search(DBLookupDTO dto) 
{ 
    dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId); 
    SetAreas(dto); 
    return View("DBLookupIndex", dto); 
} 

private void SetAreas(DBLookupDTO dto) 
{ 
    dto.Areas = _ph.GetProfiles(); 
} 

Или как это (2):

[HttpGet] 
public ActionResult DBLookupIndex(DBLookupDTO dto) 
{ 
    return SetAreasAndView(dto); 
} 

[HttpGet] 
public ActionResult Search(DBLookupDTO dto) 
{ 
    dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId); 
    return SetAreasAndView(dto); 
} 

private ActionResult SetAreasAndView(DBLookupDTO dto) 
{ 
    dto.Areas = _ph.GetProfiles(); 
    return View("DBLookupIndex", dto); 
} 
+0

Я добавил дополнительную информацию на мой вопрос.Ваше решение заставило меня понять, что я чего-то не хватает :) –

+0

См. Мой обновленный ответ. –

+0

Спасибо! Оба предоставленных вами примера могут быть использованы для решения моей проблемы! –

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