【问题标题】:how to access the current controller name inside my Razor view jquery如何访问我的 Razor 视图 jquery 中的当前控制器名称
【发布时间】:2014-05-14 11:19:31
【问题描述】:

我有以下脚本,正在多个视图中使用:-

 $("#ChoiceTag, #ChoiceName").each(function () {
            $(this).change(function () {
                if ($("#ChoiceName").prop("checked")) {
                    $.getJSON("@Url.Content("~/Firewall/LoadCSName")",
                    function (CSData) {
                        var select = $("#GeneralCSID");
                        select.empty();
                        select.append($('<option/>', {
                            value: "",
                            text: "Select Name..."
                        }));
                        $.each(CSData, function (index, itemData) {

                            select.append($('<option/>', {
                                value: itemData.Value,
                                text: itemData.Text
                            }));
                            select.val('@Model.CSIT360ID');
                    });
                });
            }

除了以下语句中的控制器名称外,所有视图的脚本都完全相同:-

$.getJSON("@Url.Content("~/Firewall/LoadCSName")",

所以我希望移动上述脚本并将其添加到单独的 .js 文件中,然后引用此脚本,但我有以下两个问题:-

  1. 如果我将脚本移动到脚本文件夹,我需要动态引用当前控制器名称来构建 URL,这可能吗

  2. 我还能像现在一样引用 viewbag 吗? 谢谢

【问题讨论】:

    标签: javascript jquery asp.net-mvc asp.net-mvc-4 razor


    【解决方案1】:

    如果将 Javascript 移动到外部文件中,则不能使用 Razor 语法。因此,@Url.Content("~/Firewall/LoadCSName") 将无法解析。

    要克服这个问题,请将其添加到您的视图中

    <script type="text/javascript"> var AppPath = '@Url.Content("~/")'</script>
    

    并像这样在脚本中引用它

    $.getJSON(AppPath + "Controller/Action")
    

    关于viewbag。只需将 viewbags 值放入如上所示的变量中,您的外部文件就可以引用它。

    希望对你有帮助

    更新

    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
    
    
        <script type="text/javascript">
            var AppPath = '@Url.Content("~/")';
            var SomeValue = '@Model.CSIT360ID';
            var ControllerName = "Firewall/LoadCSName";
        </script>
        <!--Move this to an external File-->
        <script type="text/javascript">
    
            $("#ChoiceTag, #ChoiceName").each(function () {
                $(this).change(function() {
                    if ($("#ChoiceName").prop("checked")) {
    
                        $.getJSON(AppPath + ViewBagValue), function(CSData) {
                                var select = $("#GeneralCSID");
                                select.empty();
                                select.append($('<option/>', {
                                    value: "",
                                    text: "Select Name..."
                                }));
    
                                $.each(CSData, function(index, itemData) {
    
                                    select.append($('<option/>', {
                                        value: itemData.Value,
                                        text: itemData.Text
                                    }));
    
                                    select.val(SomeValue);
                                });
                                //end each
    
                        });
                    }
                });
    
        </script>
    
    </body>
    </html>
    

    更新 2

    这就是您可以在 url.content 中引用控制器的方式

    <script type="text/javascript">
    
        var AppPath = '@Url.Content("~/" + HttpContext.Current.Request.RequestContext.RouteData.Values["controller"])'
    </script>
    

    【讨论】:

    • 但是我将在哪里引用 javascript,你添加了
    • 另一个问题为什么你在剃刀视图中引用@Url.Content("~/")?这会返回什么?
    • 我在视图中引用了@Url.Content,因为可以在此处呈现剃刀标签。这将返回相对路径。您的外部 js 文件可以引用它并使用它来为您的控制器创建相对 url。希望这会有所帮助。
    • @johnG 我已经更新了我的答案。希望代码应该更容易理解
    • 不在外部 JS 文件中,没有。但是您可以像这样动态地将它添加到视图中 var ControllerName = "@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()"
    【解决方案2】:

    您可以通过这种方式获取控制器名称:

       @{
    string controllerName = HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
    }
    

    【讨论】:

    • 但不确定我将如何引用视图包值
    • 如果我正在编写纯 JavaScript,我可以使用您上面的代码吗?还是您的意思是在局部视图中添加它?
    • 我认为 ViewBag 值也应该可以在脚本文件中访问,但不确定,因为从来没有这样做过
    • 恐怕你不能在js文件中这样做,你必须在主布局中添加你的脚本
    • 或者我可以在局部视图中添加我的脚本并在相关视图中呈现局部视图吗?因为我想避免在母版页中添加这些脚本,因为我只需要大约 10 个视图中的它们,而我的系统包含超过 200 个视图...
    【解决方案3】:

    从视图使用访问控制器名称

    @{
        ViewContext.RouteData.Values["controller"].ToString();
    }
    

    要访问控制器实例,可以使用如下

    @{
        (HomeController)ViewContext.Controller
    }
    

    【讨论】:

    • 这给了我一个 NullReferenceException。
    【解决方案4】:

    使当前控制器名称可供 JS 访问的一个(有点笨拙)是将其刻录到布局中的全局或命名空间变量分配中。

    <script>
    var app = window.app || {}
    
    app.currentController = "@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString().toLower()";
    
    </script>
    

    另外,我工作的一种常见方式是将当前控制器的类名和操作添加到 body 标记,以协助任何 javascript 中基于 DOM 的路由。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多