【问题标题】:JavaScript action result no longer working after converting to partial viewJavaScript 操作结果在转换为部分视图后不再起作用
【发布时间】:2010-07-15 10:33:27
【问题描述】:

昨天早些时候,以下验证通知运行正常。然后我们将发起此操作的请求的Index 视图转换为使用局部视图,并且Delete ActionLink 现在位于该局部视图内,现在JavaScript 方法调用的字符串参数按字面呈现,作为“目标”删除视图上的唯一内容。

    public ActionResult Delete(int id)
    {
        var perm = JobCardService.CheckBusinessRules(id);
        if (!string.IsNullOrEmpty(perm))
        {
            return JavaScript("NotifyFailure('You may not delete this Installation: " + perm + "', false, 2000);");
        }
        JobCardViewData viewData = ViewDataFactory.CreateBaseViewData<JobCardViewData>("Installation List");
        return View("Delete", viewData);
    }

Filter 动作返回局部视图,请求如下:

<div class="editor-field">
    <% using (Ajax.BeginForm("Filter", "JobCard", new AjaxOptions { UpdateTargetId = "jobList" }))
       { %>
    <%= Html.DropDownListFor(model => model.RequesterId, new SelectList(Model.RequesterList, "RequesterID", "CompanyName", Model.RequesterId), new { onchange = "$('#Select_Save').click();" })%>
    <input id="Select_Save" type="submit" value="Save" style="display: none" />
    <% 
        }%>
</div>

【问题讨论】:

  • ProfK - 问题中是否缺少某些东西 - 或者年龄终于对我造成了影响:-)。我有点挣扎才能在这里获得全貌
  • 年龄对我造成伤害的是我 :-) 我已经添加了引用的代码。
  • 你是否通过 ajax 加载局部视图?
  • Delete 操作方法应该定义 [HttpPost] 还是提供部分视图?你也可以发布它是如何使用的..很难说这个问题。
  • @Malcom,我最后的编辑显示了部分视图是如何加载的。

标签: asp.net asp.net-mvc


【解决方案1】:

如果操作方法负责返回视图,那么如果出现错误,响应似乎不应返回 JavaScript,因为不会提供任何底层 ASP.NET 页面,这意味着您会将其视为文字文本。

考虑将方法调用分配给 ViewData,并在您的客户端执行以下操作:

<% if (ViewData["X"] != null) { %>
    <script type="text/javascript">
        <%= ViewData["X"] %>
    </script>
<% } %>

像我一样调用 VIewData["X"] 应该直接渲染 JavaScript 代码并在解析时直接执行。

我认为这可能行得通;你总是可以利用其他机制,比如 eval 来解析内容,或者做任何你可能需要的事情......

【讨论】:

  • 谢谢布赖恩,这看起来像是我可以使用的东西,而不是击败 JavaScript 结果提交。
【解决方案2】:

参考本题评论ASP.NET MVC Javascript ActionResult

另一方面是使用这种返回类型被认为是一种反模式,应该避免。建议的方法是使用 Json 结果。

  1. Working example for JavaScriptResult in asp.net mvc
  2. http://devlicio.us/blogs/billy_mccafferty/archive/2009/02/07/beware-of-asp-net-mvc-javascriptresult.aspx

编辑:

由于控制器正在返回 javascript,因此另一种方法是将脚本发送回浏览器,将用户重定向到正确的页面。

   public ActionResult Delete(int id)
    {
        var perm = JobCardService.CheckBusinessRules(id);
        if (!string.IsNullOrEmpty(perm))
        {
            return JavaScript("NotifyFailure('You may not delete this Installation: " + perm + "', false, 2000);");
        }
        // you may need to do a bit more to create a URL in the form of http://...
        UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
        string url = u.Action("ActionName","ControllerName", new{id=1}); // the new Action will return the delete view
        return Javascript(String.Format("window.location =""{0}"",url);
    }

有关 UrlHelper 的更多信息,请参阅 Creating a URL in the controller .NET MVC

【讨论】:

  • 哇,说说一罐蠕虫吧。每个人都在引用 McCafferty 的博客,但他别无选择,我认为这是一个糟糕的节目。不过,您的第一个链接非常有启发性,谢谢。
【解决方案3】:

这可能不是最好的方法,但我遇到的所有其他答案都需要大量返工才能实现。这需要一个小的、简单的改变,并且完全按照要求工作。我所要做的就是从这里更改Delete 操作链接:

<%= Html.ActionLink("Delete", "Delete", new { id = item.InstallationDBNumber }) %>

到这里:

<%= Ajax.ActionLink("Delete", "Delete", new { id = item.InstallationDBNumber }, new AjaxOptions { HttpMethod = "Get" }) %>

【讨论】:

  • 一个 get 不应该改变数据。 Google(用于公共网站)或 Lucene(内部网站)可能会扫描您的网站,但会出现一些不良副作用。更好地执行重定向后获取。我看到您在操作中检查了权限,但这仍然不是一个好主意。
  • 如果我错了,请纠正我,虽然这会从服务器返回一个完整的页面/响应,但屏幕上不会更新任何内容?
  • get 不会改变数据。它检查删除是否可能发生,如果没有,则执行一个 JavaScript 函数告诉用户。 @Ahmad,当我返回 JavaScriptResult 时,我不需要在屏幕上更新任何内容。这就是为什么所有其他“更好”的方法都没有这样做的原因。模型端的“永久”删除发生在从删除视图调用的删除操作的后覆盖中。
  • @ProfK - 抱歉,在用户有权限的情况下,我实际上指的是return View("Delete", viewData);。这个视图没有在屏幕上更新?
  • 糟糕,我不知道我是否检查过!
猜你喜欢
  • 2016-02-29
  • 2011-12-17
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多