2012-10-29 44 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的警告框。