2009-07-07 17 views
6

Così sto lavorando su una Intranet applicazione web utilizzando ASP.NET MVC , e ho bisogno di creare un collegamento a una cartella in rete. Quindi, ad esempio, diciamo che volevo creare un collegamento a "C: \", e questo uri è memorizzato in site.DocsPath. Ho pensato che il modo più semplice per farlo è stato proprio creare un collegamento regolare, in questo modo:collegamento a una directory sulla rete

<a href="file:///<%= site.DocsPath %>">Documents</a> 

Questo risolve a:

<a href="file:///C:\ruby">Documents</a> 

Tuttavia, quando si fa clic sul link, non succede nulla. È fondamentalmente come fare clic sul testo normale; assolutamente non succede nulla. Nessun reindirizzamento, niente. Ho provato questo in Firefox e IE, e questo stesso comportamento si verifica in entrambi.

Inizialmente ho pensato che potessero essere le barre. Così ho incollato file:///C:\ruby nella barra degli indirizzi, per vedere se era giusto. Ha funzionato. Ho provato questo sia in Firefox e IE, e funziona in entrambi.

Così ora, sto pensando "hey, forse il mio html non è corretto per qualche motivo". Così ho creato una piccola pagina html, come tale:

<html> 
<head><title>Test Page</title></head> 
<body> 
    <a href="file:///C:\ruby">Documents</a> 
</body> 
</html> 

Ed ecco ... ha funzionato. Clicco sul link e segue effettivamente il link. E questo funziona sia in Firefox che in IE.

Quindi ora sono confuso. L'HTML è esattamente lo stesso in entrambi i casi (tramite ASP.NET MVC e in HTML statico). Eppure funziona solo nel caso HTML statico.


Ora, io sono solo tirando a cannucce. Io cerco solo incollando

<a href="file:///C:\ruby">Documents</a> 

direttamente nel ViewPage in ASP.NET MVC. Nope, non funziona.

poi cerco incollando solo un sito web casuale staticamente nel ViewPage, come:

<a href="http://www.google.com">Supreme Overlord of the Internet</a> 

E che funziona. Quindi, ora ho confermato che ASP.NET può effettivamente seguire i link generati a mano.

Ora, senza più nulla da fare, faccio qualcosa di pazzo. Ho impostato il link da qualche parte che non esiste, come:

<a href="file:///X:\this\doesnt\exist">I Hate ASP.NET MVC right now</a> 

Firefox si attacca alle sue armi e non segue esso. Tuttavia, IE lo segue effettivamente e mi dà una pagina di errore.La stessa cosa accade se site.DocsPath = "X:\this\doesnt\exist" e ho messo:

<a href="file:///<%= site.DocsPath %>">Documents</a> 




Così ora, io sono totalmente confuso. Non so cosa diavolo sta succedendo. Chiaramente, ASP.NET MVC mi odia, il che è preoccupante perché non ho mostrato altro che amore.

Se qualcuno ha qualche idea su cosa sta succedendo, gradirei molto l'aiuto. Grazie!


UPDATE: Dopo molte prove (e molte risposte e commenti da parte di tutti qui a SO molto utile), sono giunto alla conclusione che solo la creazione di un normale link alla cartella appena non funzionerà. Alla fine ho provato a mettere quella pagina html statica che ho creato sopra su un server web, e si scopre che non funziona. Ho anche creato un'applicazione Ruby on Rails e una piccola applicazione PHP e l'ho provata, e non funziona nemmeno su di essi. Quindi l'unica altra possibilità è che è in effetti una cosa del browser.

Penso che andrò avanti magari in qualche modo connettendo al server SharePoint che tutti i documenti sono gestiti da. Grazie a tutti coloro che hanno commentato e fornito varie risposte sulla domanda. Posso scegliere solo una risposta, ma i commenti e le risposte di tutti hanno fornito un'immagine chiara di ciò che stava accadendo. Grazie!

risposta

3

questo è più di un commento che una risposta, ma posso' t commento ...

Questa non è una domanda asp.net-mvc. È una domanda del browser. Una volta eseguito il rendering dell'HTML, non importa se è stato hardcoded, .net o cgi. Non odiare l'asp.net ...

Detto questo, non credo che nessun altro possa aiutarti se attraversi la posta laggiù.

Considerando i test, sembra sicuramente un problema di sicurezza. E anche questo ha perfettamente senso.

Inoltre, con un po 'googling, ho trovato questo:

http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/HTML/Q_20405367.html

Almeno in IE (vedere la risposta da MS sotto), è un ambiente di sicurezza specifico. Immagino qualcosa di simile in FF e negli altri.

Il problema si è verificato è una caratteristica nuova protezione in Internet Esplora 6 Service Pack 1. Al fine di evitare che Internet i codici vizioso da accedere ai file locali, il team di sviluppo ha sviluppato il nuovo di sicurezza funzionalità e incluso in IE6 SP1. Tieni presente che questo è un comportamento normale.

In realtà, IE6 SP1 include nuovi controlli di codice di sicurezza che impediscono l'elevazione della zona " ". Ciò significa che ai documenti situati nella zona "Internet" non sarà concesso l'accesso (tramite HREF, script ... ecc.) Ai documenti nell'area "Risorse del computer". Solo i documenti che si trovano nell'area "Trusted" o "Risorse del computer" possono accedere ai documenti nella zona "Risorse del computer" .

Pertanto, se si desidera consentire documenti non attendibili di accedere documenti nella zona "Risorse del computer", si potrebbe aggiungere l'URL di origine in "Siti attendibili" (questo deve essere fatto con cautela per evidenti di sicurezza motivi). Anche la zona "Intranet locale" è attendibile.

Inoltre, la seguente chiave di registro permette la disabilitazione del nuovo di sicurezza codici di controllo che impediscono "zona elevazione": - È possibile creare questa chiave DWORD e impostarlo a zero per disattivare questa nuova funzionalità . Inoltre, è possibile abilitarlo con cambiandolo a 1 in qualsiasi momento.

HKCU \ Software \ Microsoft \ Internet Explorer \ Main \ Disable_Local_Machine_Navigate = 0 REG_DWORD

Non è raccomandato l'uso di sopra chiave di registro in quanto si rompe la "zona elevazione" fix di sicurezza.

James

+0

Lol, in realtà non odio ASP.NET ... ero solo un po 'frustrato da questo problema quando ho scritto il post. Ho provato a farlo con Rails e ho avuto lo stesso errore, quindi immagino sia una cosa da browser. Tuttavia, è ancora molto strano che consente all'HTML statico di accedere ai file locali. Comunque, grazie per aver incluso un riferimento effettivo al problema. – thebrokencube

+2

Non penso che consenta "static html" ... probabilmente consente a un file locale di accedere a un file locale. Prova a farlo attraverso il tuo server web. Ha senso che un file: // possa puntare a un altro file (navigazione web locale da un cd per esempio) ma non http: // -> file: //. .......... Mi rendo conto che non odiate il mvc;) Se solo avessi salvato tutto il mio codice di prova con "perché f **** non funziona?", "F **************** ck! ", ecc. –

+0

Hai ragione; L'ho provato su un server web e non ha funzionato neanche. Credo che dovrò abbaiare su un altro albero per far funzionare questa funzionalità. Grazie per l'aiuto! – thebrokencube

1

Effettuare il site.site.DocsPath a System.Uri. così quando si crea DocsPath effettuare le seguenti operazioni

DocsPath = new Uri("C:\\ruby"); 

poi quando lo fai

<a href="<%= site.site.DocsPath %>">Documents</a> 

il risultato sarà

<a href="file://C:\ruby">Documents</a> 

Ma come nota a margine, non sarà in grado di servire questo esternamente dalla pagina. Se è necessario fornire i documenti sul Web, è necessario configurare un'interfaccia amichevole. Ad esempio una pagina che prende l'input come documento e quindi Response.Write il documento di nuovo al browser attraverso un gestore di qualche tipo.

+0

Hmm ... L'ho provato, e non ha funzionato = /. Fa la stessa cosa di quello che ho provato. Ma sì, so che questo non funzionerà correttamente sul web. Chiarirò cosa sto cercando di fare nel mio post originale. Grazie! – thebrokencube

2

Probabilmente alcune restrizioni di sicurezza nel browser. Hai provato altri browser?

+0

Sì, l'ho provato sia in Firefox che in IE. Chiarirò un po 'di più il mio problema nel mio post originale. Grazie! – thebrokencube

+1

Penso che questo sia di progettazione, come caratteristica di sicurezza. –

+0

Beh, l'ho fatto funzionare altrove. Funziona in una pagina html statica, e ho anche ottenuto di funzionare in rotaie prima facendolo semplicemente in modo intuitivo. – thebrokencube

1

Ho anche provato che non funziona a modo tuo. Perché non provi in ​​questo modo, File Upload Download, qui puoi usare la sezione download e mentre scarica ti chiederà se vuoi aprirlo.

+1

In realtà sembra complicato ma è molto semplice, e un'altra cosa è il codice che usa BinaryContentResult come tipo di ritorno e l'ha derivato da ActionResult, ma la versione corrente di ASP.NET MVC ha FilePathResult come tipo di ritorno per azione, lo rende molto semplice. – San

+0

Correggetemi se ho torto, ma sembra che la soluzione presentata in quel post sembra effettivamente "recuperare" quei file in modo da poterli elencare sul tuo sito web, mentre tutto ciò che voglio fare è lasciare che sia il browser a gestirlo. Ad esempio, se hai appena digitato qualcosa come C: \ nella barra degli indirizzi di Firefox, si occuperà di esso (in modo simile, IE aprirà semplicemente una finestra di Windows Explorer). – thebrokencube

+1

Sì, in realtà recupera i file, non ha a che fare con il browser. Inizialmente visualizzerà tutti i nomi dei file come collegamenti, sul sito Web, una volta fatto clic sul collegamento, ti verrà data l'opzione per salvare o aprire il file. – San

1

Forse c'è un problema con il reindirizzamento da IE a una cartella. Prova magari a reindirizzare a un file locale usando il file: /// - funziona in questo modo:

<a href="file:///C:\ruby.html">Document</a> 

?

In caso contrario, cercano forse attaccare slash a tuo URL:

<a href="file:///C:\ruby\">Documents</a> 

o utilizzare backslash:

<a href="file:///C:/ruby/">Documents</a> 
+0

Ho provato solo il collegamento a un file normale, ma non funziona. Come ho notato nella mia domanda, se prendo un link che FUNZIONA in html statico e lo copio esattamente come nella pagina di visualizzazione, NON FUNZIONA. Ad esempio, il collegamento esiste, ma quando si fa clic su di esso, non accade assolutamente nulla. Nessun reindirizzamento, nessuna pagina di errore, niente. – thebrokencube

+1

Sì, ho capito cosa stavi chiedendo. Il collegamento funzionerà se il file esiste e clicchi questo link sullo stesso computer che contiene quel file. Inoltre, funziona solo se la pagina con il link viene aperta anche localmente. Se servito da un server web (locale o meno), non funzionerà. Forse potresti ancora farlo funzionare rendendo quel sito affidabile nel tuo browser, ma non sono sicuro al 100% che funzioni. – synhershko

+0

Sì, non ho idea di come rendere il sito attendibile nel mio browser (o anche come ciò potrebbe aiutare). A questo punto ho quasi l'impressione che ci sia qualcosa che devo configurare sul webserver in modo che consenta di seguire i collegamenti locali. – thebrokencube

2

stavo lavorando su un problema simile e si avvicinò con la seguente soluzione. Sto usando ASP.NET ma non ASP.NET MVC; tuttavia, da quello che so e quello che ho letto, questo dovrebbe funzionare anche per ASP.NET MVC. In primo luogo, crea il tuo link come questo:

<a ID="A1" runat="server">Documents</a> 

Poi nel codebehind (assumendo codebehind è in C#), in Page_Load impostare un evento click:

A1.ServerClick += A1_ServerClick; 

E hanno un evento click in questo modo:

protected void A1_ServerClick(object sender, EventArgs e) 
{ 
System.Diagnostics.Process.Start("C:\\ruby"); 
} 

System.Diagnostics.Process.Start aprirà semplicemente una directory. Per evitare problemi con la directory non esistente, è possibile verificare l'esistenza con Directory.Exists ("C: \ ruby") e creare la directory se non esiste con Directory.CreateDirectory ("C: \ ruby")

Problemi correlati