【问题标题】:Inject something to ASP MVC Result向 ASP MVC 结果注入一些东西
【发布时间】:2011-11-22 09:05:23
【问题描述】:

在我的项目中,当客户端保存某些内容时,我需要添加功能,即在页面右上角显示信息框。当保存操作重定向到我的解决方案中的另一个页面时,一切正常。

客户端运行保存动作:

[SaveAction] //my own action filter to show info box
public ActionResult Details(int id, FormCollection form)
{
    var pojazd = PojazdRepo.GetById(id);;
    if (UpdateAndSave(pojazd, form))
    {
        return RedirectToAction("Index");
    }
    else
    {
        return View(GetDetailsViewModel(id, true));
    }
}

现在我的操作过滤器测试 ModelState.IsValid 为真,然后向 TempData 添加一些内容:

public class SaveActionAttribute : ActionFilterAttribute
{
    private bool test;
    private bool isAjax;

    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        test = ctx.Controller.ViewData.ModelState.IsValid;
        isAjax = ctx.HttpContext.Request.IsAjaxRequest();
        base.OnActionExecuted(ctx);
    }

    public override void OnResultExecuting(ResultExecutingContext ctx)
    {

        if (test)
        {
            if (isAjax) ctx.Controller.TempData["ActionPopUp"] = "";
            else ctx.Controller.TempData["ActionPopUp"] = "save";
        }   
        base.OnResultExecuting(ctx);
    }
}

如果TempData["ActionPopUp"] = "save",我的 Site.Master 运行脚本:

<script type="text/javascript">
    $(document).ready(function () {
        var test = '<%: TempData["ActionPopUp"] %>';
        if (test != '') SaveSuccessPopUp(test);
    });
</script>

如前所述,此解决方案工作正常,当控制器进行重定向和 Site.Master 再次加载时,我的问题是,如何将 SaveSuccessPopUp() 函数注入到操作结果中,当 AJAX 调用 Action 并返回一些东西时,怎么办'不重新加载页面并且不运行 Site.Master $(document).ready 代码块。

【问题讨论】:

    标签: javascript asp.net-mvc ajax asp.net-mvc-2


    【解决方案1】:

    好问题。

    您可能需要在此处使用局部视图。我的意思是,如果您的请求是 ajax 请求,请再次附加 TempDataTempData 将在 局部视图 中输出。

    如何将部分视图输出作为 html 块发送?

    我有一篇关于如何将部分视图作为字符串发送的博文。主题不同,但您会明白的:

    http://www.tugberkugurlu.com/archive/working-with-jquery-ajax-api-on-asp-net-mvc-3-0-power-of-json-jquery-and-asp-net-mvc-partial-views

    这是一个例子:

        [HttpPost]
        public ActionResult toogleIsDone(int itemId) {
    
            //Getting the item according to itemId param
            var model = _entities.ToDoTBs.FirstOrDefault(x => x.ToDoItemID == itemId);
            //toggling the IsDone property
            model.IsDone = !model.IsDone;
    
            //Making the change on the db and saving
            ObjectStateEntry osmEntry = _entities.ObjectStateManager.GetObjectStateEntry(model);
            osmEntry.ChangeState(EntityState.Modified);
            _entities.SaveChanges();
    
            var updatedModel = _entities.ToDoTBs;
    
            //returning the new template as json result
            return Json(new { data = this.RenderPartialViewToString("_ToDoDBListPartial", updatedModel) });
        }
    

    RenderPartialViewToString 是一个控制器扩展。你可以从下面的链接中找到完整的代码:

    https://bitbucket.org/tugberk/tugberkug.mvc/src/6cc3d3d64721/TugberkUg.MVC/Helpers/ControllerExtensions.cs

    在客户端代码中恢复 html 后,将其附加到 DOM 并对其进行处理。动画,显示/隐藏,随心所欲

    【讨论】:

    • 我考虑过在部分视图中调用此弹出函数或在 Ajax 查询中执行的 javascript 回调。但这需要在代码中搜索和修改大量位置(此应用程序非常广泛:()这就是为什么至少普通查询只需要添加到 action 属性的原因。
    • @PiotrStyczyński 我明白了,但如果你仔细想想,你会发现没有其他选择。进行 ajax 调用时,您没有呈现布局(主)页面。所以,你需要在你的客户端代码上弄清楚它。
    • 在公共覆盖 void OnResultExecuting(ResultExecutingContext ctx) 函数中,您可以访问操作调用的结果,可以选择通过调用我的弹出 JS 函数来感染 JavaScriptResult?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2012-08-11
    相关资源
    最近更新 更多