作为我项目的一部分,我将cshtml脚本部分分离到自己的文件中。除了一条线外,它大部分都成功了。最初,视图文件在脚本部分中包含以下行:
"sAjaxSource": "@Url.Action("CertificationRun", "Certifications")", //<= part of DataTable() process
我和其他程序员交谈过,他们说它会在$("#RootDirectory").val() + "/ControllerName/ActionName"
所以正确的电话会是localhost/ControllerName/ActionName
我尝试了这个建议到另一个部分,最后得到以下内容:
var ajSource = $("#RootDirectory").val() + "/ExpiredCert/ExpiredCertRun";
$('.ssdatatable').DataTable({
//irrelevant block
"lengthMenu": [[10, 25, 50, 100, 500], [10, 25, 50, 100, 500]],
"bProcessing": true,
"sDom": "TBflrtip",
"bServerSide": true,
//end irrelevant block
//"sAjaxSource": "@Url.Action("CertificationRun", "Certifications")",
//"sAjaxSource": "$(\"#RootDirectory\").val() + \"/ExpiredCert/ExpiredCertRun\" ",
"sAjaxSource": ajSource,
//more code
,
"aoColumns": [{ "mData": "VariableName" },//more columns
]
});
}
然而,在启动时,我收到以下错误:
DataTables warning: table id={id} - Ajax error
在查看官方documentation后,我使用建议的步骤调试了该部分。它返回了错误500.所以,在我深入研究这个错误之前,我想确保我理解@Url.Action("CertificationRun", "Certifications")
转换正确并正确转换它。
这样,我将能够消除我的一些理论,并朝着正确的方向前进。
答案 0 :(得分:2)
您应该在剃刀视图中执行Url.Action
方法,该方法将在服务器中执行并使用其结果(这是action方法的相对URL)并将其传递给您的js代码全局变量。确保使用javascript命名空间传递值以避免值覆盖。
所以在你的剃刀视图中,你将拥有这样的代码
<script>
var myApp = myApp || {};
myApp.urls = myApp.urls || {};
myApp.urls.certificateRunUrl= '@Url.Action("CertificationRun","Certifications")';
</script>
<script src="~/Scripts/PageSpecificExternalJsFile.js"></script>
您的PageSpecificExternalJsFile.js
,您可以像这样阅读
var url = myApp.urls.certificateRunUrl;
//use url for your datatable call
另一种选择是将其设置为表单元素并使用jQuery在外部js代码中读取此值
<div id="urls"
data-certificateRunUrl="'@Url.Action("CertificationRun","Certifications")" />
您的PageSpecificExternalJsFile.js
,您可以像这样阅读
var url = $("#urls").data("certificateRunUrl");
//use url for your datatable call
当您需要基于表单中的输入元素的url时,此方法很有用(例如:对于url获取输入元素值更改事件的数据,您可以将此url保留在输入元素数据字段中)< / p>
答案 1 :(得分:0)
事实证明,我有一个正确的实施。为了使javascript指向来自控制器的特定动作,cshtml动作代码行
$("#SignupSubmit").click(function()
{
var fName = $("#txtSignFName").val();
var lName = $("#txtSignLName").val();
var email = $("#txtSignEmail").val();
var pw = $("#txtPW").val();
if( fName == "" || lName == "" || email == "" || pw == "" )
{
alert();
}
else
{
var URL = "actionPages/signUp.php";
$.get(URL, {
fName:fName,
lName:lName,
email:email,
pw:pw},
function(response) {
$('#hiddenUserID').html(response);
});
$.ajax(
{
method: "post",
url: URL,
data: {fName:fName, lName:lName, email:email, pw:pw},
success: function(data)
{
$("#hiddenUserID").html(data);
}
});
}
});
可以转换为纯Javascript,如下所示:
"sAjaxSource": "@Url.Action("ActionName", "ControllerName")
其中RootDirectory是根目录(localhost或主页)的url字符串。 最终回答了我的问题。
在我的特定情况下,实现是正确的,我在列命名/声明方面存在差异。