1

我有一个在我的网站上多次使用的局部视图。根据您“保存”记录后的位置,它应该做一些不同的事情。

所以我正在考虑将回调函数作为字符串传递给控制器​​,然后将其传递回局部视图。

有没有更好的方法来做到这一点?

4

3 回答 3

2

在 MVC 中,所有地址/资源/url 都相对于它们默认呈现的路径。因此,如果您在部分内部有一个表单,它可以提交给两个不同的控制器操作方法,具体取决于它在哪个 url 下呈现。例如,要声明一个将提交给“更新”操作方法的表单,您将使用以下方法:

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

现在,如果此部分在 /Users/Home 下呈现,则 html 输出将变为:

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

当部分在 /Products/Home 下呈现时,这会发生变化:

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

然后,您可以在用户和产品控制器上实现两个“保存”操作方法。两者都可以执行标准的“保存”功能,但也可以执行每种情况下所需的任何独特行为。

于 2012-10-29T23:24:17.503 回答
2

如果需要,您可以传递一个魔术字符串,该字符串将通过反射调用方法。

有没有更好的办法?

我建议你确定这篇文章的来源,然后据此处理此案。

HttpContext.Current.Request.Url

将包含足够的信息让您打开。

于 2012-10-29T23:25:49.750 回答
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 的警报框。

于 2015-02-24T23:45:43.923 回答