2009-07-07 3 views
6

So arbeite ich an einer Intranet Webanwendung mit ASP.NET MVC, und ich muss einen Link zu einem Ordner im Netzwerk erstellen. Als Beispiel möchte ich sagen, dass ich eine Verknüpfung zu "C: \" erstellen wollte, und diese URL wird in site.DocsPath gespeichert. Ich die einfachste Weg gefunden, dies zu tun war nur eine regelmäßige Verbindung erstellen, wie folgt aus:Link zum Verzeichnis im Netzwerk

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

Dies zu beschliesst: Jedoch

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

, wenn Sie auf den Link klicken, nichts passiert. Es ist im Grunde so, als würde man auf normalen Text klicken; absolut nichts passiert passiert. Keine Umleitung, nichts. Ich habe das sowohl in Firefox als auch in IE versucht, und das gleiche Verhalten passiert in beiden.

Anfangs dachte ich, es könnten die Schrägstriche sein. Also habe ich file:///C:\ruby in die Adressleiste eingefügt, um zu sehen, ob es überhaupt richtig war. Es funktionierte. Ich habe das sowohl in Firefox als auch in IE versucht, und es funktioniert in beiden.

Also jetzt denke ich "hey, vielleicht ist mein HTML aus irgendeinem Grund nicht richtig". Also habe ich eine kleine HTML-Seite, wie zum Beispiel:

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

Und siehe da ..... es funktionierte. Ich klicke auf den Link, und folgt tatsächlich dem Link. Und das funktioniert sowohl in Firefox als auch in IE.

So jetzt bin ich verwirrt. Der HTML-Code ist genau in beiden Fällen (über ASP.NET MVC und in statischem HTML). Und noch funktioniert es nur im statischen HTML-Fall. Jetzt


, Ich ziehe einfach an einen Strohhalm. Ich versuche einfach,

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

direkt in die Viewpage in ASP.NET MVC einfügen. Nein, funktioniert nicht.

Dann versuche ich nur eine zufällige Website statisch in die Viewpage einfügen, wie:

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

Und die arbeitet. So, jetzt habe ich bestätigt, dass ASP.NET tatsächlich handgenerierte Links folgen kann.

Jetzt, mit nur noch nichts zu tun, mache ich etwas verrückt. habe ich den Link irgendwo, die nicht existiert, wie:

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

Firefox auf seine Pistolen klebt und sie nicht folgen. Jedoch, IE folgt tatsächlich und gibt mir eine Fehlerseite.Das gleiche passiert, wenn site.DocsPath = "X:\this\doesnt\exist" und ich habe:

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




So, jetzt bin ich total verwirrt. Ich weiß nicht, was der Teufel geht weiter. Offensichtlich hasst ASP.NET MVC mich, was beunruhigend ist, weil ich nichts als Liebe gezeigt habe.

Wenn jemand eine Idee hat, was vor sich geht, würde ich die Hilfe sehr schätzen. Vielen Dank!


UPDATE: Nach zahlreichen Tests (und viele sehr hilfreichen Antworten und Kommentaren von jedem hier auf SO), habe ich zu dem Schluss gekommen, dass nur eine normale Verbindung zum Ordner erstellen nur funktioniert nicht. Ich habe schließlich versucht, diese statische HTML-Seite, die ich oben erstellt habe, auf einen Webserver zu stellen, und es stellt sich heraus, dass es nicht funktioniert. Ich habe auch eine Ruby-on-Rails-Anwendung und eine kleine PHP-Anwendung erstellt und diese auch getestet, und sie funktioniert auch nicht. Die einzige andere Möglichkeit ist, dass es tatsächlich eine Browser-Sache ist.

Ich denke, ich werde verfolgen vielleicht irgendwie Verbindung zu dem SharePoint-Server, dass alle Dokumente verwaltet werden. Danke an alle, die die Frage kommentiert und beantwortet haben. Ich kann nur eine Antwort wählen, aber die Kommentare und Antworten aller haben wirklich ein klares Bild davon gegeben, was vor sich geht. Vielen Dank!

Antwort

3

Dies ist eher ein Kommentar als eine Antwort, aber ich kann‘ t Kommentar ...

Dies ist keine asp.net-MVC Frage. Es ist eine Browserfrage. Sobald das HTML gerendert ist, spielt es keine Rolle, ob es hartcodiert, .net oder cgi ist. Hasse nicht die asp.net ...

Mit diesem gesagt, ich glaube nicht, jemand anderes kann Ihnen helfen, wenn Sie dort drüben kreuzen.

In Anbetracht Ihrer Tests klingt es definitiv wie ein Sicherheitsproblem. Und das macht auch Sinn.

Plus, mit einigen googeln, fand ich dies:

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

Mindestens in IE (siehe die Antwort von MS unten), es ist eine spezifische Sicherheitseinstellung. Ich würde mir etwas ähnliches in FF und den anderen vorstellen.

Das Problem, das Sie stoßen werden, ist eine neue Sicherheitsfunktion in Internet erkundet 6 Service Pack 1. Um verhindert Internet bösartige Codes aus Ihren lokalen Dateien zugreifen, das Entwicklungsteam entwickelte die neue Sicherheit Feature und enthalten es in IE6 SP1. Bitte beachten Sie, dass dieses ein normales Verhalten ist.

Tatsächlich enthält IE6 SP1 neue Sicherheitscode überprüft, die "Zone Elevation" verhindern. Dies bedeutet, dass Dokumente, die sich in der Zone "Internet" befinden, nicht den Zugriff (über HREFs, Skripts usw.) auf Dokumente in der Zone "Arbeitsplatz" erhalten. Nur Dokumente, die sich in der Zone "Vertrauenswürdig" oder "Arbeitsplatz" befinden, können auf die Dokumente in der Zone "Arbeitsplatz" zugreifen, die sich in der Zone befindet.

Deshalb, wenn Sie nicht vertrauenswürdige Dokumente zulassen möchten Dokumente in der „My Computer“ Zone zuzugreifen, Sie können die Quell-URL in „Vertrauenswürdige Sites“ hinzufügen (diese mit Vorsicht aus offensichtlichen Sicherheitsgründen getan werden muss, Gründe). Die Zone "Lokales Intranet" ist ebenfalls .

Darüber hinaus ermöglicht die folgenden Registrierungs Taste, um die neuen Sicherheits deaktivieren Codes überprüfen, ob verhindern „Zone Elevation“: - Sie können diesen DWORD-Schlüssel erstellen und es Null diese neue Funktion zu deaktivieren. Sie können es auch aktivieren, indem Sie es zu zu 1 jederzeit ändern.

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

Es wird empfohlen, nicht über Registrierungsschlüssel zu verwenden, da es die "Zone elevation" Sicherheitsupdate bricht.

James

+0

Lol, ich hasse ASP.NET nicht wirklich ... Ich war nur etwas frustriert mit diesem Problem, als ich den Beitrag schrieb. Ich habe versucht, dies mit Rails zu tun, und ich habe den gleichen Fehler, also denke ich, es ist eine Browser-Sache. Es ist jedoch immer noch seltsam, dass statische HTML-Dateien auf lokale Dateien zugreifen können. Wie auch immer, danke, dass Sie einen tatsächlichen Hinweis auf das Problem haben. – thebrokencube

+2

Ich glaube nicht, dass es "statisches HTML" erlaubt ... es erlaubt wahrscheinlich einer lokalen Datei, auf eine lokale Datei zuzugreifen. Versuchen Sie, das über Ihren Webserver zu liefern. Es macht Sinn, dass eine Datei: // auf eine andere Datei zeigen kann (z. B. lokale Suche von einer CD aus), aber nicht http: // -> file: //. .......... Ich realisiere, dass Sie nicht hassen mvc;) Wenn ich nur alle meine Test-Code mit "Warum der F **** ist das nicht funktioniert?", "F **************** ck! ", usw. –

+0

Sie haben Recht; Ich habe es auf einem Webserver getestet und es hat auch nicht funktioniert. Ich denke, ich muss einfach einen anderen Baum anbellen, damit diese Funktionalität funktioniert. Danke für die Hilfe! – thebrokencube

1

Machen Sie die site.site.DocsPath eine System.Uri. so, wenn DocsPath Erstellen Sie wie folgt vor

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

dann, wenn Sie tun

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

gibt er

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

Aber nur als Randnotiz, Sie nicht in der Lage sein, dies zu dienen extern von der Seite. Wenn Sie die Dokumente im Internet bereitstellen müssen, müssen Sie eine internetfreundliche Schnittstelle einrichten. So wie eine Seite, die die Eingabe als das Dokument nimmt und dann Response.Writes das Dokument zurück an den Browser über einen Handler einer Art.

+0

Hmm ... Ich habe es versucht, und es hat nicht funktioniert = /. Es macht das Gleiche wie das, was ich versucht habe. Aber ja, ich weiß, dass dies im Web nicht richtig funktionieren wird. Ich werde klären, was ich in meinem ursprünglichen Beitrag versuche. Vielen Dank! – thebrokencube

2

Wahrscheinlich einige Sicherheitsbeschränkung im Browser. Hast du andere Browser getestet?

+0

Ja, ich habe es in Firefox und IE versucht. Ich werde mein Problem ein bisschen mehr in meinem ursprünglichen Beitrag klären. Vielen Dank! – thebrokencube

+1

Ich denke, das ist von Design, als Sicherheitsmerkmal. –

+0

Nun, ich habe es anderswo arbeiten lassen. Es funktioniert in einer statischen HTML-Seite, und ich habe es auch in Schienen zu arbeiten, indem ich es einfach auf die intuitive Weise gemacht habe. – thebrokencube

1

Ich habe auch versucht es funktioniert nicht auf Ihre Weise. Warum versuchen Sie nicht so, File Upload Download, hier können Sie den Download-Bereich verwenden und während des Downloads werden Sie gefragt, ob Sie es öffnen möchten.

+1

Eigentlich sieht es kompliziert aus, aber es ist sehr einfach, und eine weitere Sache ist der Code, der BinaryContentResult als Rückgabetyp verwendet und er hat es von ActionResult abgeleitet, aber die aktuelle Version von ASP.NET MVC hat FilePathResult als Rückgabetyp für Aktion, es macht es sehr einfach. – San

+0

Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, dass die in diesem Blogpost präsentierte Lösung diese Dateien tatsächlich "abruft", so dass Sie sie auf Ihrer Website auflisten können, während ich nur den Browser damit umgehen lassen möchte. Wenn Sie beispielsweise etwas wie C: \ in die Firefox-Adressleiste eingegeben haben, würde es sich damit befassen (ähnlich würde IE einfach ein Windows Explorer-Fenster öffnen). – thebrokencube

+1

Ja, es ruft tatsächlich die Dateien ab, es ist nicht mit dem Browser zu tun. Zunächst werden alle Dateinamen als Links auf der Website angezeigt, sobald Sie auf den Link klicken, erhalten Sie die Möglichkeit, die Datei zu speichern oder zu öffnen. – San

1

Vielleicht gibt es ein Problem mit der Umleitung von IE zu einem Ordner. Versuchen Sie vielleicht, zu einer lokalen Datei umzuleiten, indem Sie file: /// verwenden - funktioniert das:

?

Wenn ja, versuchen vielleicht Slash zu Ihrer URL kleben:

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

Oder verwenden Schrägstriche:

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

Ich habe versucht, nur auf eine normale Datei zu verknüpfen, aber es funktioniert nicht. Wie ich in meiner Frage bemerkte, wenn ich einen Link nehme, der in statischem html funktioniert und es genau wie in die viewpage kopiert, funktioniert es NICHT. Wie der Link existiert, aber wenn Sie darauf klicken, passiert absolut nichts. Keine Weiterleitung, keine Fehlerseite, nichts. – thebrokencube

+1

Ja, ich habe verstanden, was Sie gefragt haben. Der Link funktioniert, wenn die Datei vorhanden ist und Sie auf diesen Link auf demselben Computer klicken, der diese Datei enthält. Es funktioniert auch nur, wenn die Seite mit dem Link auch lokal geöffnet ist. Wenn es von einem Webserver (lokal oder nicht) bedient wird, wird es nicht funktionieren. Vielleicht könntest du es trotzdem schaffen, indem du diese Seite in deinem Browser vertrauenswürdig machst, aber ich bin nicht 100% sicher, dass das funktionieren wird. – synhershko

+0

Ja, ich habe keine Ahnung, wie man die Seite in meinem Browser vertrauenswürdig macht (oder auch, wie das helfen würde). An dieser Stelle habe ich den Eindruck, dass ich etwas auf dem Webserver konfigurieren muss, damit lokale Links folgen können. – thebrokencube

2

Ich war gerade arbeitet an einem ähnlichen Problem und kam mit der folgenden Lösung auf. Ich verwende ASP.NET aber nicht ASP.NET MVC; Von dem, was ich weiß und was ich lese, sollte dies jedoch auch für ASP.NET MVC funktionieren. Erstellen Sie zunächst Ihren Link wie folgt:

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

Dann in dem Code-Behind (unter der Annahme Code-Behind ist in C#), in Page_Load gesetzt ein Click-Ereignis auf:

A1.ServerClick += A1_ServerClick; 

Und ein Click-Ereignis wie diese:

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

System.Diagnostics.Process.Start einfach ein Verzeichnis öffnen. Um Probleme mit dem nicht vorhandenen Verzeichnis zu vermeiden, können Sie mit Directory.Exists ("C: \ ruby") nach dem Vorhandensein suchen und das Verzeichnis erstellen, wenn es nicht mit Directory.CreateDirectory ("C: \ ruby") vorhanden ist