【问题标题】:Calling partial view through AJAX in Asp.net MVC 5在 Asp.net MVC 5 中通过 AJAX 调用部分视图
【发布时间】:2023-03-14 19:45:01
【问题描述】:

我正在使用以下代码来调用局部视图:

$('#btnGetMilestones').click(function () {
$.ajax({
    url: "GetMilestones",
    type: "get",
    success: function (result) {
        $('#milestonesContainer').html(result);
    },
    error: function (xhr, status, error) {
        var msg = "Response failed with status: " + status + "</br>"
        + " Error: " + error;
        $('#milestonesContainer').html(msg);
    },
    complete: function (xhr, status) {
        var doneMsg = "Operation complete with status: " + status;
        alert(doneMsg);
    }
});

});

对于这个 ActionResult:

public PartialViewResult GetMilestones()
    {
        return PartialView("_GetMilestones");
    }

局部视图具有项目的里程碑(里程碑和项目是模型)。当我这样调用局部视图时:

<div id="milestonesContainer">
    @Html.Partial("_GetMilestones")
</div>

它运行良好,它获得了项目的所有里程碑。 但是当我尝试通过 ajax 调用部分视图时,错误被调用: Response failed with status: error

错误:错误请求

我在一个项目的详细信息视图中,所以 url 是这样的http://localhost:55623/Projects/Details/2002

我是 ajax 和 javascript 的新手,所以如果可能的话,请像对初学者一样向我解释一下。

更新:

在得到一些答案并四处寻找解决方案后,我明白为什么会出现错误。 我在详细信息视图中,所以 url 是这样的:http://localhost:55623/Projects/Details/2002 看到有一个 ID 参数。 当我进行 ajax 调用时,url 就像这样 http://localhost:55623/Projects/Details 没有 id 参数。所以作为回报,我得到一个 400 错误代码

【问题讨论】:

标签: ajax asp.net-mvc razor asp.net-mvc-partialview


【解决方案1】:

以我的评论为基础:

抱歉,我对 url 这个词的表述含糊不清。这就是我的意思:

除非您在浏览器中的当前网址是http://&lt;hostname&gt;/&lt;Controller that contains GetMilestones&gt;,否则您的 AJAX 网址不正确。 AJAX url 需要是/&lt;Controller&gt;/GetMilestones

开头的/ 将您带到项目的根目录,然后由您的路由配置处理其余部分(通常为/Controller/Method/Id)。这就是为什么 AJAX url 通常需要为/Controller/Method。但是,如果您在 Index 视图中,您的 url 通常是 http://&lt;hostname&gt;/Controller。因此,如果是这种情况并且您的 AJAX url 只是 Method,它将带您到 http://&lt;hostname&gt;/Controller/Method,因为您没有在 AJAX url 前面加上 /

【讨论】:

  • GetMilestones 动作在 ProjectsController 中。我导航到项目的详细信息,有调用局部视图的按钮...我不知道 id 参数是否必须对这个错误做些什么,但我有一个类似的项目,我在其中测试了ajax 调用工作,它没有问题,相同的代码,除了视图中的元素和没有 id 参数。
【解决方案2】:

尝试使用url: "@Url.Action("GetMilestones")" 代替url: "GetMilestones",它将呈现操作的实际相对路径,即/{Controller}/GetMilestones。

还要确保您在控制器中引用正确的文件名,因为在您的视图中您引用“_GetMilestone”并且您说这有效,但在您的控制器中您引用“_GetMilestones " 如果您的文件名确实是 "_GetMilestone",这将无法解决

如果您收到 500 错误,这意味着您很可能正在点击该操作,并且在渲染局部视图之前或期间发生了异常。尝试通过键入localhost:port/Projects/GetMilestones 在浏览器中直接导航到局部视图的操作,然后查看是否出现异常页面。确保在 Startup 类的 Configure 方法中执行以下操作:

public void Configure (IApplicationBuilder app) 
{    
    app.UseDeveloperExceptionPage();
}

【讨论】:

  • 不应该是“@Url.Action('GetMilestones')”吗?
  • 不!由于它是剃刀语法 (@),这意味着以下是 C# 方法调用。在 C# 中,单引号用于字符文字。话虽如此,当您将“@Class.Method("")”之类的内容放入 javascript 块中时,MVC 会理解,只有从 @ 到 ) 的部分是 C#,其余部分是 javascript。结果是您在两个 javascript 双引号之间渲染了一串字符 /Controller/GetMilestones,从而在渲染文档时生成了一个 javascript 字符串文字 "/Controller/GetMilestones"
  • 我把ajax代码写在一个单独的js文件里。现在我把它写在视图里面,而不是错误是:Internal Server Error
  • 你确定你用正确的名字引用你的局部视图吗?我注意到您在一个地方引用了 _GetMilestones,而在另一个地方您引用了 _GetMilestone。
  • 哦,是的,因为最后没有s的那个是检查它是否有效。我将在问题中对其进行编辑,以免其他人感到困惑
【解决方案3】:

您应该考虑利用 Url.Action 等辅助方法来生成要通过 ajax 调用的操作方法的正确相对路径。如果你是 js 代码在视图里面,你可以简单地调用类似的方法

url: "@Url.Action("GetMilestones","Project")",

如果在外部js文件中,你仍然可以使用helper方法生成路径并将其设置为外部js文件的变量。确保在这样做时进行 javascript 命名空间,以避免可能覆盖 js 全局变量。

所以在你的视图/布局中你可以这样做

<script>
    var myApp = myApp || {};  
    myApp.Urls = myApp.Urls || {};     
    myApp.Urls.mileStoneUrl= '@Url.Action("GetMilestones","Project")';
</script>
<script src="~/Scripts/PageSpecificExternalJsFile.js"></script>

在您的PageSpecificExternalJsFile.js 文件中,您可以像这样阅读它

$(function(){
   $('#btnGetMilestones').click(function () {
      $.ajax({
           url: myApp.Urls.mileStoneUrl,
           //Your existing code goes here

           })
     });
});

【讨论】:

  • 必须在 _Layout 视图中还是在我调用 ajax 的视图中?
  • 你可以把它放进去。如果你把它放在个人视图中w
  • 我喜欢这种方式,但是使用外部js文件只写url:'/Projects/GetMilestones/'是不是更容易?
  • 使用辅助方法将确保它可以在任何托管环境中工作(例如:yourSite.someDomain.com/ 等)。
【解决方案4】:

您需要将第一个 url 更改为与路由匹配的内容:

 '/<Controller>/GetMilestones/'

从 PartialViewResult 切换到 ActionResult

去 ajax 之类的:

url: "GetMilestones",
type: "get",
contentType: 'application/html; charset=utf-8',
dataType : 'html'

【讨论】:

    【解决方案5】:

    感谢大家的回答。我的问题得到了答案,也许有点出乎意料。她是: 更改ajax方法:

    $('#btnGetMilestones').click(function () { 
            $.ajax({
                url: '/Projects/GetMilestones/' + "?id=" + window.location.href.split('/').pop(),                
                type: "GET",
                success: function (data) {
                    $('#milestonesContainer').html(data);
                },
                error: function (xhr, status, error) {
                    var msg = "Response failed with status: " + status + "</br>"
                    + " Error: " + error;
                    $('#milestonesContainer').html(msg);
                },
                complete: function (xhr, status) {
                    var doneMsg = "Operation complete with status: " + status;
                    alert(doneMsg);
                }
            });
        });
    

    以及动作结果:

    public ActionResult GetMilestones(int? id)
        {             
            var forProject = db.Projects.Where(x => x.ID == id).SingleOrDefault();
            return PartialView("_GetMilestones",forProject);
        }
    

    或相同的操作结果,但 ajax 请求略有不同:

    $('#btnGetMilestones').click(function () { 
      var id;
       id = @Model.ID;
    
        $.ajax({
            url: '/Projects/GetMilestones',
            type: "GET",
            data: "id="+id,
            success: function (data) {
                $('#milestonesContainer').html(data);
            },
            error: function (xhr, status, error) {
                var msg = "Response failed with status: " + status + "</br>"
                + " Error: " + error;
                $('#milestonesContainer').html(msg);
            },
            complete: function (xhr, status) {
                var doneMsg = "Operation complete with status: " + status;
                alert(doneMsg);
            }
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 2017-06-14
      • 2011-06-18
      相关资源
      最近更新 更多