2015-05-19 45 views
2

我知道这是已回答了很多次类似的requeriments一个共同的问题,但我没有找到解决它在我的方案的方式。我使用DevExpress MVC组件。有像下面这样的树视图:用行动执行Ajax调用在MVC5

@Html.DevExpress().TreeView(settings => 
{ 
    settings.Name = "NavigationClientsList"; 
    settings.AllowSelectNode = true; 
    Model.ForEach(_client => 
    { 
     settings.Nodes.Add(node => 
     { 
      node.Name = String.Format("{0}_client_{1}", settings.Name, _client.ClientID); 
      node.Text = _client.ClientName; 
     }); 
    }); 

    settings.ClientSideEvents.NodeClick = "OnTreeViewNodeClick"; 

    settings.PreRender = (source, e) => 
    { 
     ASPxTreeView treeView = (ASPxTreeView)source; 
     treeView.ExpandAll(); 
    }; 
}).GetHtml() 

而且我的NodeClick事件:

function OnTreeViewNodeClick(s, e) { 
    if (e.node.name.indexOf("_client_") > -1) { 
     var tmpDivDescription = e.node.name.split("_"); 
     if (tmpDivDescription.length = 3) { 
      var tmpID = tmpDivDescription[2]; 
      //alert(tmpID); 
      //$("#testDisplay").text("ALGO"); 
      $.ajax({ 
       url: 'Home/Client/',//'@Url.Action("Client", "Home")',//'Home/Client/25',//'@Url.Action("Client", "Home")', 
       data: { 'id': tmpID }, 
       dataType: "html", 
       success: function (result) { 
        //alert('OK!') 
        $("#DataDisplay").html(result); 
       }, 
       error: function (xhr) { alert('ERROR!' + xhr.responseText) } 
      }); 
     } 

    } else { 

    } 
} 

我试了两种方法来执行Ajax调用

url: 'Home/Client/'url: '@Url.Action("Client", "Home")'

第一按预期工作,但在尝试使用第二个UrlAction时,服务器抱怨无法找到该资源:

Beschreibung:HTTP 404. Die gesuchte Ressource oder eine ihrerAbhängigkeitenwurdemöglicherweiseentfernt,umbenannt oder istvorübergehendnichtverfügbar。在这里,你可以看到你的网站,并且可以在你的网站上找到你想要的东西。

Angeforderter网址:/@Url.Action("Client”, “家”)

正如你所看到的,所请求的URL添加一个 “/”。我不知道这是否是我的问题的原因。

因为我已找到了所有的主题和资源,他们所使用的“正常” Url.Action格式。

有什么想法?

+0

您使用的领域? –

+0

我在Application_Start方法中有'AreaRegistration.RegisterAllAreas();',但我没有定义任何Special。我保留模板的Default RegisterRoutes。 – blfuentes

+0

是您的外部文件中的NodeClick事件吗?如果这样的剃刀语法将不可用 – Mackan

回答

2

您不能在外部js文件中使用Razor语法。相反,你将不得不使用要么...

  1. 你尝试的静态解,'/Home/Client/'
  2. 移动整个JavaScript以你的观点(不推荐)
  3. 使用JavaScript变量存储URL,并将其传递到外部文件:

    <script type="text/javascript"> 
        var myPath = '@Url.Action("Client","Home")'; 
    </script> 
    

    而在外部JavaScript文件:

    $.ajax({ 
        url: myPath; 
        .... 
    
  4. 另一个类似的选项是使用html5数据属性。通常我选择是否Ajax调用被放置在一个事件的选项,就像click

    <span data-url='@Url.Action("Client","Home")'>...</span> 
    

    和外部JavaScript文件:

    $("span").click(function() { 
        $.ajax({ 
         url: $(this).attr("data-url"), //or $(this).data("url") 
         .... 
    
+1

谢谢,它工作。 – blfuentes

+0

@Mackan哪种方法比较好,1或3? – frost

+1

@霜取决于您的项目和偏好。为了可维护性,可扩展性和与其他人共享代码,对所有带路径的js变量使用视图似乎是最好的想法。但如果它是一个较小的项目,并且适合您的偏好,则可以直接在js文件中使用静态url。就我个人而言,我已经使用了两种方法,还有其他一些方法(比如在url中设置数据属性等)。 – Mackan