2012-10-29 3 views
1

내 사이트에서 두 번 이상 사용되는 부분 뷰가 있습니다. 레코드를 "저장"한 후에 당신이 어디에 있느냐에 따라 다른 것을해야합니다.부분 뷰에 콜백 함수 전달 mvc

그래서 콜백 함수를 문자열로 컨트롤러에 전달한 다음 부분 뷰로 다시 전달할 생각이었습니다.

더 좋은 방법이 있나요?

+0

귀하의 사이트에서 한 번 이상보기를 사용한다고하셨습니다. 나는 다른 컨트롤러를 사용한다는 것을 의미한다고 가정하고 있습니다. 컨트롤러 조치는 이미 동일한 데이터를 다르게 처리하는 콜백입니다. 너는 확실히 이것을 생각하고있다. – Garvin

+0

부분 뷰는 사이트의 여러 위치에서 사용됩니다. 저장 조작은 다른 컨트롤러가 아닌 동일한 컨트롤러를 호출합니다. 그러나 저장 작업이 발생한 후에는 현재 어떤 페이지에 있는지에 따라 다른 작업이 수행되어야합니다. 말이 돼? – MindGame

+1

그런 다음 모델에서 =>보기로 => 컨트롤러에 전달할 수있는 작업의 차이를 범주로 분류하는 매개 변수를 추가해야합니다. => 각 경우에 대해 특수 함수 또는 논리. – Garvin

답변

2

MVC에서 모든 주소/리소스/URL은 기본적으로 렌더링되는 경로를 기준으로합니다. 그래서 부분 안에 폼이 있다면, 렌더링 된 URL에 따라 두 개의 다른 컨트롤러 액션 메서드에 제출할 수 있습니다. 예 : "업데이트"액션 메소드에 제출하는 양식을 선언하는이를 사용합니다 :이 부분은 아래에서/사용자/홈 렌더링되는 경우 @using (Html.BeginForm("Save")) {

지금, HTML 출력이 becone됩니다

<form action="/Products/Save" method="POST">

,691 : 부분은/제품/홈에서 렌더링 될 때

<form action="/Users/Save" method="POST">

이 후 변경

그런 다음 사용자 및 제품 컨트롤러에 두 가지 "저장"작업 메서드를 구현할 수 있습니다. 둘 다 표준 "저장"기능을 수행 할 수 있지만 각 경우에 필요한 고유 한 동작을 수행합니다.

1

원하는 경우 반사를 통해 메서드를 호출하는 마법 문자열을 전달할 수 있습니다.

더 좋은 방법이 있습니까?

본인이이 게시물의 출처를 확인한 다음이를 기반으로 사례를 처리 할 것을 제안합니다.

HttpContext.Current.Request.Url 

전원을 켜기에 충분한 정보가 포함됩니다.

1

이전 질문이지만이 작업을 수행 할 방법을 찾고 뭔가를 찾았습니다.

기본보기에서 부분 뷰의 ajax 게시물을 설정 한 후에 javascript 메소드를 허용하기 위해 기본보기 및 하위 부분보기에 매우 간단한 것을 추가 할 수 있기를 원했습니다.

@{Html.RenderAction("_Create", new { Callback = "myCallback" });} @{Html.RenderAction("_Create", new { Model = Model, Callback = "myCallback" });}

는 "myCallback는"자바 스크립트 함수의 이름입니다

난 당신이 모델 데이터를 전달 여부를해야하는지 여부에 따라 다음 행 중 하나를 기본보기에서 부분보기를 호출 예를 들어 :

function myCallback(result) { 
    alert(result.Id); 
} 

여기에서 당신은 컨트롤러 액션이 값을 요청할 수 있으며, 여러 부분 뷰에서이를 사용하려는 경우 다음 작업에서보기 가방에 값을 추가하지만, ~ 될거야. filter 속성을 사용하려면 필터를 사용하십시오.

public class MyFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var callBackValue = filterContext.RouteData.Values["Callback"]; 

     if (callBackValue != null) 
     { 
      filterContext.Controller.ViewBag.Callback = callBackValue.ToString(); 
      filterContext.RouteData.DataTokens.Remove("Callback"); 
      filterContext.RouteData.Values.Remove("Callback"); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

이것은으로 RouteData 개체 밖으로 "콜백"값을 가져오고 ViewBag.Callback 값에 설정 :

는 다음과 같은 사용자 지정 작업 필터를 만듭니다. RouteData에서 값을 제거해야합니다. 그렇지 않으면 컨트롤러 동작을 찾을 수 없습니다 ("콜백"이라는 매개 변수로 작업을 찾고 있으므로)

그런 다음보기에서 @ViewBag.Callback으로이 값에 액세스 할 수 있습니다. 예를 들어, 당신은 아약스 호출이있을 수 있습니다

function createProduct(callback) { 
    $.ajax({ 
     type: 'POST', 
     url: '/Product/_Create', 
     data: { 
      Name: $('#Name').val() 
     }, 
     success: function (result) { 
      var callBack = @(ViewBag.Callback ?? "null"); 

      if (callback) 
       callback(result); 
      else { 
       if (result) { 
        var url = '/Product/Details'; 
        url += "/" + result.Id; 
        window.location.href = url; 
       } 
      } 
     }, 
     error: function (ajaxContext) { alert('Bad error'); }, 
     timeout: 10000 
    }); 
} 

부분보기의 디폴트의 동작은, 세부 사항 페이지를로드하는 것입니다,하지만 별도의 콜백 함수는 기본보기가 제공되는 경우 (또는은을에 도착하지만 ViewBag.Callback) 콜백 함수를 덮어 씁니다. 여기에서 내 메인보기는 새 제품 ID가있는 경고 상자를 단순히 표시하는 기능으로 덮어 씁니다.

관련 문제