注入ASP MVC结果

时间:2011-11-22 09:05:24

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

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

客户端运行保存操作:

[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);
    }
}

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

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

如前所述,这个解决方案工作正常,当控制器再次加载Redirect和Site.Master时,我的问题是,如何将SaveSuccessPopUp()函数注入动作结果,当AJAX调用Action并返回某些内容时,请问重新加载页面,不要运行Site.Master $(document).ready代码块。

1 个答案:

答案 0 :(得分:0)

好问题。

您可能需要在此处使用部分视图。我的意思是,如果您的请求是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并对其进行处理。动画,显示/隐藏它,随心所欲地做任何事情