ASP.NET MVC에서 저장된 데이터에서 URL/Route를 재구성하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/825616

문제

ASP.NET MVC 프레임 워크와 그 배관에 대한 익숙하지 않은 것은 저를 여기로 데려 왔으며, 누군가 내 질문을 읽고 고려하는 데 필요한 인내심에 감사드립니다!

좋아요, 여기 시나리오가 있습니다. 검색을 기반으로 데이터를 표시하고 다른 데이터에서 드릴링, 컨텍스트 특정 데이터를 기반으로 한 보고서 (예 : Foo의 세부 사항 페이지에있는 다음 클릭에 따라 보고서를 표시하는 그리드가있는 수많은 페이지가있는 응용 프로그램이 있습니다. foo와 관련된 데이터 테이블을 보여주는 링크에서

앱 전체에있는이 모든 페이지에서 사용자는 이름과 설명을 제공하여 "보고서"또는 그리드를 저장할 수 있습니다. 이것은 그리드에 표시되는 데이터를 실제로 저장하지 않으며 그리드의 모습을 정의하는 매개 변수를 저장하고 사용했던 매개 변수를 저장합니다. 가져 오기 데이터는 앱 (동작, 컨트롤러, 경로)의 "위치"를 정의하는 매개 변수를 저장합니다. 기본적으로 보고서/그리드에 대한 메타 데이터 및 구성 방법에 대한 메타 데이터가 많이 있습니다.

이 저장된 보고서는 모두 단일 목록으로 제공되며 앱의 특정 페이지에 이름과 설명을 표시하며 각 "/reports/saved/248"과 같은 일반 URL에 연결되어 있습니다 (여기서 248은 예입니다. 보고서의 ID).

다음은 도움이 필요한 부분입니다.

URL "/reports/saved/248"을 통해 작업에 도달하고 해당 특정 보고서의 데이터베이스에서 메타 데이터를 꺼내면 해당 데이터와 요청을 표시하는 데 사용 된 동일한 작업, 컨트롤러 및 경로로 어떻게 리디렉션 할 수 있습니까? 보고서가 원래 저장되었다는 견해? 본질적으로, 사용자가 저장된 것과 동일한 URL로 보고서를 동일한보기로보고 싶어합니다. 가능하다면 기본적으로 메소드 호출을하는 것과 같은 동일한 조치를 기본적으로 "호출"할 수있는 것이 좋을 것입니다.


업데이트 : 불행히도, 우리의 보고서 페이지 (예 :이 그리드가 나타나는 페이지)는 편안한 URL을 사용하지 않습니다. 예를 들어, 고급 검색 페이지를 호출하는 것이 있습니다. 선택 목록, 텍스트 상자 등이 포함 된 양식에서 사용자가 해당 페이지를 제출할 때, 우리는 모델 바인더가 우리를 위해 구축하는 복잡한 유형을 받아들이는 작업에 게시를 수행합니다. 데이터베이스에서 저장된 고급 검색을 선택합니다. 그 예는 내 문제를 대피합니다.

감사

도움이 되었습니까?

해결책

나는 당신이 Routevaluedictionary를 취하는 서명과 함께 retirecttonaction을 사용하고 싶다고 생각합니다. 리디렉션하는 방법은 컨트롤러의 ValueProvider에서 값을 가져올 수 있어야합니다. 그것은 다음과 같은 것처럼 보일 수 있습니다.

public ActionResult Saved( int id )
{
    var reportParams = db.Reports.SingleOrDefault( r => r.ID == id );
    if (reportParams == null)
       ...handle error...

    var routeValues = ParamsToRouteValueDictionary( reportParams );

    return RedirectToAction( reportParams.Action, reportParams.Controller, routeValues );
}

private RouteValueDictionary ParamsToRouteValueDictionary( object parameters )
{
     var values = new RouteValueDictionary();
     var properties = parameters.GetType().GetProperties()
                                .Where( p => p.Name != "Action" && p.Name != "Controller" );
     foreach (var prop in properties)
     {
         values.Add( prop.Name, prop.GetValue(parameters,null) );
     }

     return values;
}

편집하다

필터 모델을 메소드 매개 변수로 사용하면 실제로 더 쉽게 만들 수 있습니다. 당신은 당신의 행동의 버전을 얻거나 게시하면됩니다.

 [ActionName("People")]
 [AcceptVerbs( HttpVerbs.Get )]
 public ActionResult PeopleDisplay( SearchModel filter )
 {
     return People( filter );
 }

 [AcceptVerbs( HttpVerbs.Post)]
 [ValidateAntiForgeryToken]
 public ActionResult People( SearchModel filter )
 {
     ....
 }

그런 다음 보고서에 대한 DB에 필터 매개 변수 (이름 별), 동작 ( "사람") 및 컨트롤러를 저장합니다. 리디렉션 결과는 get and and the peopledisplay 메소드로 지시되며, 이는 단순히 올바른 매개 변수로 사람 메소드를 호출합니다. 양식에서 게시하면 People 메소드를 직접 호출합니다. 두 가지 방법을 사용하면 CSRF 예방 메커니즘을 사용할 수 있습니다. TempData에서 플래그를 사용하여 GET 조치가 접근을 제한하는 경우 리디렉션 메커니즘을 통해서만 호출되도록 할 수 있습니다.

최종 편집

또 다른 대안은 단순히 사용 된 뷰를 간단하게 저장하는 것입니다. 그리고 리디렉션을 수행하는 대신 적절한보기를 제공하는 것입니다. 고려해야 할 사항 중 하나는 리디렉션을 수행하는 것이 모든 매개 변수를 포함하는 URL로 끝나는 반면,보기 렌더링은 URL을 단독으로 남겨두고 보고서를 작성할 때 사용 된 URL과 동일한보기 만 표시한다는 것입니다. .

다른 팁

REDIRECTTOACTION 방법을 사용하여 경로 값과 함께 모든 컨트롤러의 특정 동작 메소드에 301 리디렉션을 발행 할 수 있습니다.

ReportMeta meta = _reportDataAccess.Get(id);
return RedirectToAction(meta.Action, meta.Controller, meta.RouteData);

그 값은 다음과 같습니다.

meta.Action = "Bar";
meta.Controller = "Foo";
meta.RouteData = new {
    // possibly settings for the grid
    start = DateTime.Min,
    end = DateTime.Now,
    sort = "Date"
    // you get the idea
};

물론, 내가 볼 수있는 즉각적인 문제는 시간이 지남에 따라 컨트롤러/동작 메소드가 변경 될 때 발생하는 일입니다. 보고서 데이터가 유효하지 않습니다. 그러나 당신은 아마 이미 그것을 생각했을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top