내 사이트에서 두 번 이상 사용되는 부분 뷰가 있습니다. 레코드를 "저장"한 후에 당신이 어디에 있느냐에 따라 다른 것을해야합니다.부분 뷰에 콜백 함수 전달 mvc
그래서 콜백 함수를 문자열로 컨트롤러에 전달한 다음 부분 뷰로 다시 전달할 생각이었습니다.
더 좋은 방법이 있나요?
내 사이트에서 두 번 이상 사용되는 부분 뷰가 있습니다. 레코드를 "저장"한 후에 당신이 어디에 있느냐에 따라 다른 것을해야합니다.부분 뷰에 콜백 함수 전달 mvc
그래서 콜백 함수를 문자열로 컨트롤러에 전달한 다음 부분 뷰로 다시 전달할 생각이었습니다.
더 좋은 방법이 있나요?
MVC에서 모든 주소/리소스/URL은 기본적으로 렌더링되는 경로를 기준으로합니다. 그래서 부분 안에 폼이 있다면, 렌더링 된 URL에 따라 두 개의 다른 컨트롤러 액션 메서드에 제출할 수 있습니다. 예 : "업데이트"액션 메소드에 제출하는 양식을 선언하는이를 사용합니다 :이 부분은 아래에서/사용자/홈 렌더링되는 경우 @using (Html.BeginForm("Save")) {
지금, HTML 출력이 becone됩니다
<form action="/Products/Save" method="POST">
<form action="/Users/Save" method="POST">
이 후 변경
그런 다음 사용자 및 제품 컨트롤러에 두 가지 "저장"작업 메서드를 구현할 수 있습니다. 둘 다 표준 "저장"기능을 수행 할 수 있지만 각 경우에 필요한 고유 한 동작을 수행합니다.
원하는 경우 반사를 통해 메서드를 호출하는 마법 문자열을 전달할 수 있습니다.
더 좋은 방법이 있습니까?
본인이이 게시물의 출처를 확인한 다음이를 기반으로 사례를 처리 할 것을 제안합니다.
HttpContext.Current.Request.Url
전원을 켜기에 충분한 정보가 포함됩니다.
이전 질문이지만이 작업을 수행 할 방법을 찾고 뭔가를 찾았습니다.
기본보기에서 부분 뷰의 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가있는 경고 상자를 단순히 표시하는 기능으로 덮어 씁니다.
귀하의 사이트에서 한 번 이상보기를 사용한다고하셨습니다. 나는 다른 컨트롤러를 사용한다는 것을 의미한다고 가정하고 있습니다. 컨트롤러 조치는 이미 동일한 데이터를 다르게 처리하는 콜백입니다. 너는 확실히 이것을 생각하고있다. – Garvin
부분 뷰는 사이트의 여러 위치에서 사용됩니다. 저장 조작은 다른 컨트롤러가 아닌 동일한 컨트롤러를 호출합니다. 그러나 저장 작업이 발생한 후에는 현재 어떤 페이지에 있는지에 따라 다른 작업이 수행되어야합니다. 말이 돼? – MindGame
그런 다음 모델에서 =>보기로 => 컨트롤러에 전달할 수있는 작업의 차이를 범주로 분류하는 매개 변수를 추가해야합니다. => 각 경우에 대해 특수 함수 또는 논리. – Garvin