2012-10-29 43 views
1

我有一個在我的網站上多次使用的局部視圖。根據你在「保存」記錄後的位置,它應該做一些不同的事情。將回調函數傳遞給局部視圖mvc

所以我正在考慮將一個回調函數作爲字符串傳遞給控制器​​,然後將其傳遞迴部分視圖。

有沒有更好的方法來做到這一點?

+0

你說你在網站上多次使用該視圖。我假設這意味着與不同的控制器。控制器操作已經是一個處理相同數據的回調。你肯定是在推翻這一點。 – Garvin

+0

局部視圖用於網站中的多個位置。保存操作調用的SAME控制器不是一個不同的控制器。但是在保存操作發生後,根據您所在的頁面,應該發生不同的事情。那有意義嗎? – MindGame

+1

然後,您應該添加一個參數,用於分類操作中的差異,您可以從您的模型=>傳遞到您的視圖=>傳遞給您的控制器=>針對每種情況的專用函數或邏輯。 – Garvin

回答

2

在MVC中,所有地址/資源/ url都是相對於默認渲染路徑的。所以如果你在partial中有一個表單,它可以提交給兩個不同的控制器操作方法,具體取決於它已經被渲染的URL。例如。聲明將提交給「更新」操作方法的形式,你可以使用這個:

@using (Html.BeginForm("Save")) {

現在,如果這部分是在/用戶/主頁呈現,HTML輸出將becone:

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

<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函數」是一個JavaScript函數的名稱,例如:

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

從這裏你可以要求在控制器動作這個值,然後從操作的價值添加到視圖袋,但如果你要使用這個多部分景色它將會清潔有一個過濾屬性爲你做這個。

創建下面的自定義操作過濾器:

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訪問此值。例如,你可能有一個Ajax調用:

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的警告框。