javascript类比cshtml @ Url.Artion(动作,控制器)

时间:2016-12-12 18:36:20

标签: javascript jquery asp.net-mvc razor

作为我项目的一部分,我将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")转换正确并正确转换它。

这样,我将能够消除我的一些理论,并朝着正确的方向前进。

2 个答案:

答案 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字符串。 最终回答了我的问题。

在我的特定情况下,实现是正确的,我在列命名/声明方面存在差异。