2014-02-11 2 views
0

Я - noob для ASP.NET и MVC, поэтому, пожалуйста, несите меня, и заблаговременно за помощь! -Ошибка ссылки с MVC

Я пытаюсь сделать ссылку на файл KML, который хранится в корневом каталоге приложения, и я не могу заставить его работать, смотрите ниже:

function initCB(instance) { 
      ge = instance; 
      ge.getWindow().setVisibility(true); 

      var href = 'http://code.google.com/apis/earth/documentation/samples/kml_example2.kml'; 
      var href2 = '~/cngKml.kml' 
      google.earth.fetchKml(ge, href2, kmlFinishedLoading); 

     } 

Это работает, когда я указываю его þér «HREF ', но когда я указываю его на переменную' href2 ', она ничего не загружает.

Полный index.cshtml ниже:

@{ 
    ViewBag.Title = "STI"; 
    string path = HttpUtility.JavaScriptStringEncode(HttpContext.Current.Server.MapPath("~/kml_example2.kml")); 
} 
<head> 
    <title>CNG</title> 
    <script type="text/javascript" src="https://www.google.com/jsapi"> </script> 
    <script type="text/javascript"> 

     var ge; 
     var placemark; 
     var kmlObject; 

     google.load("earth", "1", { "other_params": "sensor=false" }); 

     function init() { 
      google.earth.createInstance('map3d', initCB, failureCB); 
     } 

     function initCB(instance) { 
      ge = instance; 
      ge.getWindow().setVisibility(true); 

      var href = 'http://code.google.com/apis/earth/documentation/samples/kml_example2.kml'; 
      var href2 = '@path'; 
      google.earth.fetchKml(ge, href2, kmlFinishedLoading); 
     } 

     function kmlFinishedLoading(obj) { 
      kmlObject = obj; 
      if (kmlObject) { 
       if ('getFeatures' in kmlObject) { 
        kmlObject.getFeatures().appendChild(placemark); 
       } 
       ge.getFeatures().appendChild(kmlObject); 
       if (kmlObject.getAbstractView()) 
        ge.getView().setAbstractView(kmlObject.getAbstractView()); 
      } 
     } 

     function failureCB(errorCode) { 
     } 

     google.setOnLoadCallback(init); 

    </script> 
</head> 

@section featured { 
    <section class="featured"> 
     <div class="content-wrapper"> 
      <hgroup class="title"> 
       <h1>@ViewBag.Title.</h1> 
       <h2>@ViewBag.Message</h2> 
      </hgroup> 
     </div> 
    </section> 
} 

<div id="gearth"> 
    <div id="map3d" style="width:960px; height:640px; align-self:center;"></div> 
</div> 

Результирующий HTML:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8" /> 
     <title>STI</title> 
     <link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" /> 
     <meta name="viewport" content="width=device-width" /> 
     <link href="/Content/site.css" rel="stylesheet"/> 

     <script src="/Scripts/modernizr-2.6.2.js"></script> 

    </head> 
    <body> 
     <header> 
      <div class="content-wrapper"> 
       <div class="float-left"> 
        <p class="site-title"><a href="/">sti</a></p> 
       </div> 
       <div class="float-right"> 
        <section id="login"> 

     Hello, <a class="username" href="/Account/Manage" title="Manage">reecea</a>! 
<form action="/Account/LogOff" id="logoutForm" method="post"><input name="__RequestVerificationToken" type="hidden" value="J0EkwX2027gRZ-gDCvH1WMHGpGUnW-Sl2m3jEOpKw2684DUjjywYCFBQ9pPNfJ93pyJIZ9XH9HLMYdFNiVcHohtNsvKA1sIiKf3tL3EekGI1" />   <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> 
</form>  

        </section> 
        <nav> 
         <ul id="menu"> 
          <li><a href="/">Home</a></li> 
           <li><a href="/Admin">Admin</a></li> 
           <li><a href="/Account/Manage">My Account</a></li> 
         </ul> 
        </nav> 
       </div> 
      </div> 
     </header> 
     <div id="body"> 

    <section class="featured"> 
     <div class="content-wrapper"> 
      <hgroup class="title"> 
       <h1>STI.</h1> 
       <h2>CNG Stations Map</h2> 
      </hgroup> 
     </div> 
    </section> 

      <section class="content-wrapper main-content clear-fix"> 

<head> 
    <title>CNG</title> 
    <script type="text/javascript" src="https://www.google.com/jsapi"> </script> 
    <script type="text/javascript"> 

     var ge; 
     var placemark; 
     var kmlObject; 

     google.load("earth", "1", { "other_params": "sensor=false" }); 

     function init() { 
      google.earth.createInstance('map3d', initCB, failureCB); 
     } 

     function initCB(instance) { 
      ge = instance; 
      ge.getWindow().setVisibility(true); 

      var href = 'http://code.google.com/apis/earth/documentation/samples/kml_example2.kml'; 
      var href2 = 'c:\\users\\reecea\\documents\\visual studio 2013\\Projects\\CngStationMap\\CngStationMap\\kml_example2.kml'; 
      google.earth.fetchKml(ge, href2, kmlFinishedLoading); 
     } 

     function kmlFinishedLoading(obj) { 
      kmlObject = obj; 
      if (kmlObject) { 
       if ('getFeatures' in kmlObject) { 
        kmlObject.getFeatures().appendChild(placemark); 
       } 
       ge.getFeatures().appendChild(kmlObject); 
       if (kmlObject.getAbstractView()) 
        ge.getView().setAbstractView(kmlObject.getAbstractView()); 
      } 
     } 

     function failureCB(errorCode) { 
     } 

     google.setOnLoadCallback(init); 

    </script> 
</head> 


<div id="gearth"> 
    <div id="map3d" style="width:960px; height:640px; align-self:center;"></div> 
</div> 


      </section> 
     </div> 
     <footer> 
      <div class="content-wrapper"> 
       <div class="float-left"> 
        <p>&copy; 2014 - STI</p> 
       </div> 
      </div> 
     </footer> 

     <script src="/Scripts/jquery-1.8.2.js"></script> 



<!-- Visual Studio Browser Link --> 
<script type="application/json" id="__browserLink_initializationData"> 
    {"appName":"Chrome","requestId":"9f6ba0e6c2d041d29dcc37b58bbb4ef4"} 
</script> 
<script type="text/javascript" src="http://localhost:54165/39bfdebe74ed45968bc576a815347820/browserLink" async="async"></script> 
<!-- End Browser Link --> 

</body> 
</html> 

Web.Config Файл:

<system.webServer> 
    <staticContent> 
     <remove fileExtension=".kml"/> 
     <mimeMap fileExtension=".kml" mimeType="application/vnd.google-earth.kml+xml"/> 
    </staticContent> 

ответ

0

Попробуйте изменить это:

var href2 = path; 

к тому, что:

var href2 = @path; 

Без @ голец он рассматривается как простой JS переменной

Кстати, если вы определяете переменную в C#, а затем использовать его в JavaScript, не забудьте использовать HttpUtility.JavaScriptStringEncode:

string path = HttpUtility.JavaScriptStringEncode(HttpContext.Current.Server.MapPath("~/cngKml.km")); 
+0

Я сделал ваше предложенное изменение, а затем добавил тип mime в файл Web.Config. Теперь земля google вообще не загружается :-( Что мне не хватает? – ProfessionalAmateur

+0

Используйте отладчик, чтобы узнать, каково значение пути, которое можно использовать. – vmg

+0

Вы изменили только переменную пути? Или что-то еще? – vmg

1

Попробуйте просто var href2 = '/cngKml.kml'

Вы не можете использовать физические пути к файлам для л чернил (т.е. Server.MapPath("~/cngKml.kml")).

Вы не можете использовать пути в клиентском коде, которые необходимо решить серверу (то есть "~/anything").

Вы не можете объявить переменную в C#, а затем использовать ее в JavaScript, как вы пытались. В приведенном выше случае вам нужно хотя бы использовать '@path' (хотя он все равно не сработает).

Кроме того, убедитесь, что переход на файл kml на ваш веб-сервер будет даже работать, поскольку неизвестные типы файлов обычно не обслуживаются IIS. Если это проблема, вы можете исправить запись в web.config, похожую на this SO post, more ref.

+0

Почему вы говорите, что не можете использовать физические пути к файлам для ссылок? Я пробовал, и он работает. – vmg

+1

@Vitaliy, потому что я не могу представить * любой * сценарий, который выиграет от передачи пути физического файла сервера к я вижу много начинающих, пытающихся использовать их для image 'src' и т. д., и я пытаюсь помочь самоописанному« noob to ASP.NET », сообщая ему, что он должен * не * делать это. Относительный или абсолютный URL-адрес правильный. Физический путь к файлу - нет. Пожалуйста, опубликуйте свой код на веб-сервере и сообщите мне, работает ли для клиента 'Z: \ somepath \ cnhKml.kml'. – MikeSmithDev

+0

А, я понял, что вы имели в виду, что код MapPath не будет работать. Понятно, я согласен с вами. На самом деле ваш ответ был прав. – vmg