404错误:未找到 Ajax jquery MVC

5
我在Visual Studio 2013中创建了一个MVC3项目,视图引擎是razor。首先,我在视图(cshtml)的@section Scripts{}中编写jquery.ajax,它可以正常工作。但是,当我将脚本分离到.js文件并进行调试时,我会收到错误: (在IIS Express调试)
IIS 8.0详细错误-404.0-未找到... 更多信息:此错误意味着服务器上不存在该文件或目录。创建该文件或目录,然后再次尝试请求。
..
我的jquery函数(archive.js):
jQuery.AjaxGetProjects = function (dropdownId, detailDropDownId, authorized) {

var projectId = $(dropdownId).val();
if (projectId != null && projectId != '') {
    var url =
    $.ajax({
        type: "POST",
        url: '@Url.Action("GetProjects", "Archive")',
        data: {
            'projectId': projectId,
            'authorized': authorized
        },
        success: function (departman) {
            var length = 0;
            $(detailDropDownId).empty();
            $.each(departman, function (index, proje) {
                length = length + 1;
                $(detailDropDownId).append($('<option/>', {
                    value: proje.Value,
                    text: proje.Text,
                    selected: proje.Selected
                }));
            });
            if (length == 2) {
                $(detailDropDownId).trigger('change');
            }

        },
        error: function (xhr, ajaxOptions, thrownError) {
            // bu kısımda eğer ajax işlemi başarısız ise
            // hata mesajı verebiliriz.
            alert(xhr.responseText);
        }
    });
}

}

Controller :

public class ArchiveController : BaseController
{
   ...
   public ActionResult GetProjects(int projectId, bool authorized)
    {

        IArchive arch = WcfServiceHandler.GetDmsService<IArchive>();

        List<Poco> list = arch.GetProjects(UserManager.GetUserInfo(), projectId);
        var t = MvcHelper.GetDropDownList<Poco>(list, "NAME", "ID", "");
        return Json(t, JsonRequestBehavior.AllowGet);
    }

我尝试过这个方法,但不起作用(我得到了一个新的错误:找不到资源):

  <system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

请帮忙...

1
'@Url.Action("GetProjects", "Archive")' 是 Razor 代码。Razor 代码不会在外部脚本文件中解析。您需要在主视图中定义一个变量,然后从脚本文件中访问它。 - user3559349
@StephenMuecke,你能给个例子吗?我对MVC完全不熟悉。 - Adem Aygun
在主视图中,var myUrl = '@Url.Action("GetProjects", "Archive")';,而在脚本文件中则是 $.ajax({ url: myUrl , .... - user3559349
@StephenMuecke 谢谢。现在它运行得很好。 - Adem Aygun
2个回答

6

除非您使用类似RazorJS扩展程序,否则无法在JavaScript文件中使用Razor。如果您查看浏览器开发工具中的JS,您会看到输出的URL是:

url: '@Url.Action("GetProjects", "Archive")',

应该是这样的:

url: www.yoursite.com/Archive/GetProjects

为了解决这个问题,您可以从视图中调用该JS并传入URL,例如:
视图:
<script>
    callMethod('@Url.Action("GetProjects", "Archive")');
</script>

那么你的JS代码应该是这样的:
function callMethod(url) {
   ....

或者,如果无法实现,则可以将其硬编码为以下内容:
url: '/Archive/GetProjects'

但是如果你部署到子目录下的站点中,请注意该链接将无效。


我们还可以“追加参数”进行检查,具体请参考这里 - Shaiju T
将@url.action转换为直接URL对我很有帮助。只需检查路径即可。在程序发布后在服务器上运行时,.net框架执行的评估不会被执行。 - Alper

1

JavaScript无法使用Razor语法,因此@Url.Action("GetProjects", "Archive")将无法工作,请尝试将POST URL作为参数传递或硬编码,例如。

jQuery.AjaxGetProjects = function (dropdownId, detailDropDownId, authorized) {

var projectId = $(dropdownId).val();
if (projectId != null && projectId != '') {
var url =
$.ajax({
    type: "POST",
    url: '/Archive/GetProjects',
    data: {
        'projectId': projectId,
        'authorized': authorized
    },
    success: function (departman) {
        var length = 0;
        $(detailDropDownId).empty();
        $.each(departman, function (index, proje) {
            length = length + 1;
            $(detailDropDownId).append($('<option/>', {
                value: proje.Value,
                text: proje.Text,
                selected: proje.Selected
            }));
        });
        if (length == 2) {
            $(detailDropDownId).trigger('change');
        }

    },
    error: function (xhr, ajaxOptions, thrownError) {
        // bu kısımda eğer ajax işlemi başarısız ise
        // hata mesajı verebiliriz.
        alert(xhr.responseText);
    }
});

}

或者

jQuery.AjaxGetProjects = function (dropdownId, detailDropDownId, authorized, postUrl) {

var projectId = $(dropdownId).val();
if (projectId != null && projectId != '') {
var url =
$.ajax({
    type: "POST",
    url: postUrl,
    data: {
        'projectId': projectId,
        'authorized': authorized
    },
    success: function (departman) {
        var length = 0;
        $(detailDropDownId).empty();
        $.each(departman, function (index, proje) {
            length = length + 1;
            $(detailDropDownId).append($('<option/>', {
                value: proje.Value,
                text: proje.Text,
                selected: proje.Selected
            }));
        });
        if (length == 2) {
            $(detailDropDownId).trigger('change');
        }

    },
    error: function (xhr, ajaxOptions, thrownError) {
        // bu kısımda eğer ajax işlemi başarısız ise
        // hata mesajı verebiliriz.
        alert(xhr.responseText);
    }
});
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接