我有一个在我的网站上多次使用的局部视图。根据您“保存”记录后的位置,它应该做一些不同的事情。
所以我正在考虑将回调函数作为字符串传递给控制器,然后将其传递回局部视图。
有没有更好的方法来做到这一点?
我有一个在我的网站上多次使用的局部视图。根据您“保存”记录后的位置,它应该做一些不同的事情。
所以我正在考虑将回调函数作为字符串传递给控制器,然后将其传递回局部视图。
有没有更好的方法来做到这一点?
在 MVC 中,所有地址/资源/url 都相对于它们默认呈现的路径。因此,如果您在部分内部有一个表单,它可以提交给两个不同的控制器操作方法,具体取决于它在哪个 url 下呈现。例如,要声明一个将提交给“更新”操作方法的表单,您将使用以下方法:
@using (Html.BeginForm("Save")) {
现在,如果此部分在 /Users/Home 下呈现,则 html 输出将变为:
<form action="/Users/Save" method="POST">
当部分在 /Products/Home 下呈现时,这会发生变化:
<form action="/Products/Save" method="POST">
然后,您可以在用户和产品控制器上实现两个“保存”操作方法。两者都可以执行标准的“保存”功能,但也可以执行每种情况下所需的任何独特行为。
如果需要,您可以传递一个魔术字符串,该字符串将通过反射调用方法。
有没有更好的办法?
我建议你确定这篇文章的来源,然后据此处理此案。
HttpContext.Current.Request.Url
将包含足够的信息让您打开。
老问题,但我正在寻找一种方法来做到这一点并想出了一些东西。
我希望能够在我的主视图和子部分视图中添加一些非常简单的内容,以允许在部分视图中的 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 的警报框。