在Asp.net MVC 5中通过AJAX调用部分视图

时间:2016-10-20 14:40:27

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

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

$('#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调用局部视图时,会调用错误:响应失败并显示状态:错误

错误:错误请求

我在项目的详细信息视图中,因此网址如下http://localhost:55623/Projects/Details/2002

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

更新:

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

5 个答案:

答案 0 :(得分:2)

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

同时确保您在控制器中引用正确的文件名,如您在视图中引用&#34; _GetMilestone&#34;并且你说它有效,但在你的控制器中你引用&#34; _GetMilestone s &#34;如果您的文件名确实是&#34; _GetMilestone&#34;

,则无法解决

如果您收到500错误,则表示您可能正在点击该操作,并且在呈现部分视图之前或期间发生异常。尝试通过键入localhost:port/Projects/GetMilestones直接在浏览器中导航到部分视图操作,然后查看是否显示了例外页面。确保在Startup类的Configure方法中执行类似的操作:

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

答案 1 :(得分:2)

以我的评论为基础:

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

除非您在浏览器中的当前网址为http://<hostname>/<Controller that contains GetMilestones>,否则您的AJAX网址不正确。 AJAX网址必须为/<Controller>/GetMilestones

开始/将您带到项目的根目录,然后其余部分由您的路由配置(通常为/Controller/Method/Id)处理。这就是AJAX网址通常需要/Controller/Method的原因。但是,如果您处于Index视图,则您的网址通常为http://<hostname>/Controller。因此,如果是这种情况并且您的AJAX网址只是Method,则会将您带到http://<hostname>/Controller/Method,因为您没有使用/添加您的AJAX网址。

答案 2 :(得分:2)

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

这样的方法
Would you like to perform other calculations?(Y/N)
 y
Would you like to perform other calculations?(Y/N)
 Y
Would you like to perform other calculations?(Y/N)
 n

如果它在外部js文件中,您仍然可以使用辅助方法生成路径并将其设置为外部js文件的变量。确保在执行此操作时执行javascript命名空间,以避免可能覆盖js全局变量。

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

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

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

一样阅读
PageSpecificExternalJsFile.js

答案 3 :(得分:2)

您需要将第一个网址更改为与路线匹配的内容:

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

从PartialViewResult切换到ActionResult

去寻找ajax:

FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password);
    .continueWithTask(new Continuation<AuthResult, Task<Void>>() {
        @Override
        public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception {
            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                .setDisplayName(fullname)
                .build();
            return t.getResult().getUser().updateProfile(profileUpdates);
        }
    })
    .addOnFailureListener(this, mOnSignInFailureListener)
    .addOnSuccessListener(this, mOnSignInSuccessListener); // <- problem!

答案 4 :(得分:1)

感谢大家回答。我得到了我的问题的答案,也许它有点没有预料到。她是: 改变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);
        }
    });
});