我目前在ASP MVC网站的控制器方法中使用Process.start()
。这是一个小型的Intranet应用程序,因此除了我们设置的基本内容之外的安全性不是主要问题。
用户将能够输入作为LAN上共享文件夹位置的附件的文件路径。然后,当启动每个帐户的编辑页面时,该页面将显示指向附件的超链接。用户应该能够单击超链接并打开文件,而不是文件的副本或下载文件的副本,以便他们可以进行编辑和保存编辑。
我的第一次尝试是创建以下ActionLink
,将文件的位置发送给控制器。
<div class="M-editor-label" style="width: 400px;word-wrap: break-word;">
@Html.ActionLink(Model.Attachment, "OpenAttachment", "BankListMaster", new { location = Model.Attachment }, new { @target = "_blank" })
</div>
然后控制器使用Process.Start()
打开文件,如此
public void OpenAttachment(string location)
{
try
{
EventLog.WriteEntry("Monet", "Inside OpenAttachment |URL| " + location);
Process proc = new Process();
proc.StartInfo = new ProcessStartInfo(location);
proc.Start();
}
catch (Exception ex)
{
EventLog.WriteEntry("Monet", ex.StackTrace);
}
}
我在本地测试时工作正常,但是服务器没有安装Office副本,因此我在catch
块中收到此错误:
No application is associated with the specified file for this operation. at
System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at Monet.Controllers.BankListMasterController.OpenAttachment(String location) in
C:\Projects\sym_Monet_INT\Monet\Controllers
任何人都可以指出我正在使用的方法的修复方向,或者指向一个更好的方法来实现相同的目标吗?
答案 0 :(得分:1)
Process.Start()
方法不适用于您要完成的任务。服务器上运行的控制器无法在最终用户的系统上启动进程。在测试中,这只能起作用,因为服务器和客户端碰巧是同一台机器。应用程序客户端上运行的唯一代码是Web浏览器,Web浏览器的唯一控制点是JavaScript。您可以创建一个JavaScript函数,类似于以下内容:
<script type="text/javascript">
function OpenFile(filePath) {
var sh = new ActiveXObject("WScript.Shell");
var fullFileName = "file://" + filePath;
sh.run("\"" + fullFileName + "\"", 1);
}
</script>
然后在这样的按钮的onclick方法中调用它:
<button onclick="OpenFile('c:/Users/UserName/Desktop/Test.txt');">Open</button>
然后,您可以使用Razor View语法将button方法中的路径替换为相应的路径。另请注意,这使用ActiveX,因此您需要确保在客户端浏览器中允许ActiveX。