양식없이 컨트롤러로 다시 뷰에서 수정되지 않은 개체를 전달하는 방법은 무엇입니까?

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

  •  08-07-2019
  •  | 
  •  

문제

짧은: ModelBinding은 객체를보기에서 컨트롤러로 어떻게 전달합니까?

긴:
먼저, 검색 양식을 통해 사용자가 제공 한 매개 변수를 기반으로 일부 객체는 데이터베이스에서 검색됩니다. 이러한 객체에는 고객에게 보이는 (예 : 정의되지는 않는) 메타 데이터가 제공됩니다 (예 : 객체의 이름 지정 및 가격은 지역마다 다릅니다).
나중에 사이트에서 사용자는 이러한 객체의 세부 사항을 표시 해야하는 링크를 클릭 할 수 있습니다. 이러한 메타 데이터는 표시하는 데 중요하지만 정의되지 않으므로 컨트롤러에서 이전에 변경된 객체를 다시 가져와야합니다. 기본 ASP.NET MVC ModelBinding을 사용하면 .toString () 메소드가 사용됩니다. 이 오프 코스는 완전한 개체를 재현하기 위해 관련 문자열을 반환하지 않습니다.
나는 iserializable 인터페이스가 관련 될 것이라고 생각했을 것입니다. 그러나 이것은 그렇지 않습니다. 원하는 효과를 얻으려면 어떻게해야합니까? 나는 내가이 질문에 직면 한 첫 번째 사람이라고 상상할 수 없다. 그래서 나는 어딘가에 뭔가 빠진 것 같다 ...

도움이 되었습니까?

해결책

기본 모델 바인딩은 이름별로 양식 매개 변수를 가져와 인수 목록에 지정된 유형의 속성과 일치합니다. 예를 들어, 모델에는 "가격"및 "이름"속성이있는 경우 양식에는 ID/이름 "가격"및 "이름"이있는 입력을 포함해야합니다 (케이스 insensitive match를 사용한다고 생각합니다). 바인더는 반사를 사용하여 이러한 키와 관련된 양식 값을 적절한 유형으로 변환하고 매개 변수에 의해 지정된 유형의 새로 생성 된 객체의 속성에 할당합니다 (다시 반사에 의해 도출 됨).

당신은 실제로 이것의 소스를보고 (그리고 다운로드) 할 수 있습니다. http://www.codeplex.com/aspnet, 당신은 거기에서 MVC 소스로 드릴 다운해야하지만. 나는 DefaultModelBinder 소스에 대한 링크를 제공하지만, 그 구성 방식은 개정판이 도입 될 때 링크가 변경된다고 생각합니다.

따라서 질문에 답하려면 재현하려는 객체의 속성에 해당하는 양식에 매개 변수 (숨겨 질 수 있음)가 필요합니다. 컨트롤러에 양식 (보기에)을 게시 할 때 바인더는 양식 매개 변수를 사용하여 지정된 유형의 객체를 재구성해야합니다. 양식 매개 변수의 값에서 객체 속성으로 변환 해야하는 경우 자신의 사용자 정의 모델 바인더를 구현해야 할 것입니다.

편집] 두 번째 게시물에 대한 응답으로 :

맞춤형 객체를 사용하는 작업에 대한 링크를 다시 원한다고 가정 해 봅시다. 특정 키를 사용하여 사용자 정의 된 객체를 TempData (또는 하나 이상의 포스트 백을 통해 지속 해야하는 경우 세션)에 사용자 정의 객체를 저장할 수 있습니다. 그런 다음 액션 링크를 구성하고 익명 클래스에서 ActionLink의 값으로 객체의 키를 제공 할 수 있습니다. 키를 요청 매개 변수로 전달합니다. 우리의 행동에서 우리는이 매개 변수의 키를 사용하여 tempdata에서 객체를 검색 할 수 있습니다.

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}

다른 팁

@tvanfosson

설명해 주셔서 감사하지만 링크는 어떻습니까? (양식 없음) 현재 html.actionLink (C => C.Action (매개 변수), "레이블")는 객체를 매개 변수로 취합니다. 이것들은 URL 부품으로 변환되어야합니다. 이를 위해 MVC는 항상 .toString () 메소드로 이동합니다. Tostring 방법에서 내 객체를 직렬화하고 싶지 않습니다.
어떻게 든 프레임 워크가 내 객체를 연속화하는 데 도움이되지 않아야합니까? iserialize 인터페이스를 통해 말합니까?

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