转换为部分视图后,JavaScript操作结果不再有效

时间:2010-07-15 10:33:27

标签: asp.net asp.net-mvc

昨天早些时候,以下验证通知正常运行。然后我们转换了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>

3 个答案:

答案 0 :(得分:1)

请参阅此问题的评论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
  3. 修改

    由于从Controller返回了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

答案 1 :(得分:1)

如果action方法负责返回一个视图,那么响应似乎不应该返回一个JavaScript,如果是错误的,因为没有提供底层的ASP.NET页面,这意味着你会将它看作文字文本。

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

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

像我一样调用VIewData [“X”]应直接呈现JavaScript代码并在解析时直接执行。

我认为这可行;你总是可以利用eval之类的其他机制来解析内容,或做任何你可能需要的其他机制....

答案 2 :(得分:0)

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

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

到此:

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