将Pameters传递给ASP.NET中的ActionResult函数

时间:2013-09-02 21:41:28

标签: c# asp.net

我的程序的基本思想如下:我有一个网页,在用户提供一些输入后运行C#程序。此C#程序输出一个字符串,然后将显示在不同的网页上。简而言之,我只想将此字符串从一个网页传递到另一个网页,然后将其打印到页面。然而事实证明这非常困难。这是我目前的尝试:

private ActionResult CallProgram(string path)
    {
        //some code from calling my C# program
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.CreateNoWindow = false;
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardOutput = true;
        startInfo.FileName = @"\\WMRILTriageTool\Triage\callRunEXE\callRunEXE.exe";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.Arguments = "-f " + path + " -d 0 -w 1";

        using (Process exeProcess = Process.Start(startInfo))
        {
            output = exeProcess.StandardOutput.ReadToEnd(); //output saved to string
            exeProcess.WaitForExit();   
        }

        return RedirectToAction("Result?results=output"); //pass output to ActionResult
    }

然后调用此ActionResult函数:

    [ValidateInput(false)]
    public ActionResult Result(string results)
    {

        ViewBag.Message = "Results";
        ViewBag.toWrite = results;

        return View();
    }

正如您所看到的,我尝试过使用查询字符串,但这不起作用。我收到错误:

"从客户端检测到潜在危险的Request.Path值(?)"

为了解决这个问题,我尝试将以下内容放入Web.config:

<system.web>
<httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />
<pages validateRequest="false" />
</system.web>

但它不起作用(仍然得到相同的错误)。总而言之,如何将我的CallProgram函数中的字符串传递给ActionResult函数然后传递给另一个网页?这个看似简单的程序花了我比我承认的更长的时间。非常感谢任何有关此事的帮助。谢谢。

3 个答案:

答案 0 :(得分:0)

我在这里看到了很多问题。首先,我不知道你怎么会得到你得到的错误。这行代码:

return RedirectToAction("Result?results=output")

每次都会重定向到同一个硬编码位置(Result?results=output)。我怀疑你认为你正在做更多这样的事情:

return RedirectToAction("Result?results=" + output)

根据exeProcess.StandardOutput.ReadToEnd()

的返回值,可能会产生您所说的错误

我还要说保持你所做的配置更改将是一个巨大的错误。这些是.NET内置的安全防护,可防止恶意用户攻击您的网站。如果你在没有完全理解你在做什么的情况下删除它们,很可能会遇到麻烦。

如果您显示您尝试传递查询字符串的字符串,我们可能会为您提供更多帮助。

答案 1 :(得分:0)

您应该考虑使用在页面之间共享信息的viewmodel类,而不是使用url来传递数据。它比你目前的方式更安全。

您可能需要查看此msdn tutoria l。

答案 2 :(得分:0)

将输出作为URL传递将有很多限制。您可以在URL中作为查询字符串发送的字符数有限制,如果您想在URL中发送它们,最好执行URLEncode / URLDecode,这样您就不会遇到任何问题。将值传递给另一个结果的最佳方法是使用Viewmodel类。例如

             public class Result
            {
               public string Output;
            }

并将结果实例传递给结果操作。我建议的另一种方法是使用 TempData ,这是专门针对这种仅重定向的情况。 TempData与ViewData类似,不同之处在于它持续存在两个连续的请求,这使得它对于在两个不同的控制器操作之间传递数据之类的东西很有用