2017-01-10 2 views
0

I가 다음과 같은 동작 방식 :데이터 전달

[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으로 다시 향합니다.

제 질문은; 내가 뭘 잘못 했니? 비슷한 문제에 대한 솔루션으로 제공되는 위와 유사한 코드 예제를 보았습니다. 그러나 어떤 이유로 그것이 나를 위해 작동하지 않습니다.

는 편집 : 첫 번째 대답이 온 후

는 내가 어떤 정보가 누락 된 것을 깨달았다. 페이지가로드 될 때마다 새 프로파일/영역이 추가 된 경우보기에서 렌더링되는 드롭 다운을 업데이트해야합니다. 나는 면도날로 그 일을한다 :

그래서 나는 새로운 행동을하는 대신 RedirectToAction을 사용해야한다. 더 좋은 방법이 없다면? :)

어떤 도움을 주셔서 감사합니다!

답변

0

또 다른 옵션이 존재하는 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() - 메서드가 List (주문 목록)을 반환한다는 것입니다. 나는 빨리 Google에 노력했지만 그 문제에 대한 해결책을 찾지 못했습니다 (적어도 현재 프로그래밍 기술 수준에서 이해할 수있는 것은 없습니다). 어쩌면 당신은 제안이 있을까요? btw를 도와 주셔서 감사합니다! –

+0

당신은 객체를 직접 저장할 수 있어야합니다. 그리고 나서 그것을 캐스팅하십시오 (업데이트 된 답변 참조). 양자 택일로 serialise/deserialise 제안으로 JSON에서/deserialise 수 있습니다 여기에 (http://stackoverflow.com/questions/34638823/store-complex-object-in-tempdata-in-mvc-6) –

+1

고마워 도움! ... 링크에 감사드립니다. 전에 제대로 사용하는 방법을 몰랐기 때문에 나는 전에 TempData를 사용 해본 적이 없지만 어떻게 작동하는지 더 잘 이해하게되었습니다. 당신과 피터 모두 내 문제에 대한 견고한 (그리고 일하는) 해결책을 가지고 왔으므로 어느 것을 사용할 것인지 알아 내려고 노력할 것입니다. 도와 주셔서 감사합니다 :) –

0

RedirectToAction의 object 매개 변수는 생성 된 후 "다른 페이지로 리디렉션"결과로 브라우저로 전송되는 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 
} 

업데이트 : 당신이 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) :

피터 B의 대답에 additon에서
[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

고마워요! 귀하의 제공된 예제 모두 내 문제를 해결하는 데 사용할 수 있습니다! –