您可以将外部网页作为视图插入吗?

时间:2013-06-17 15:00:08

标签: c# asp.net-mvc-4

我正在尝试在我的网页中创建一个视图,但Html.ActionLink仅适用于Controller,我不会尝试检索View

我尝试使用Html.ActionLink并使用ControllerRedirect到网址,但它会重定向网页而不是更改内部View

 <li>@Html.ActionLink("MyExtPage", "MyExtPage", "Home")</li>

 public ActionResult MyExtPage() {
      return Redirect("http://my.url/");
 }

使用创建的View,我可以返回View,但如果我想返回外部提供的网页怎么办?如果我不需要,我真的不想使用frames

 public ActionResult Index() {
      ViewBag.Title = "Home";
      return View();
 }

以上是有效的,因为我有一个Index.cshtml文件,但是如果我想将http://google.com作为视图插入,该怎么办?

3 个答案:

答案 0 :(得分:1)

  

以上是有效的,因为我有一个Index.cshtml文件,但是如果我   想要将http://google.com作为视图插入,例如?

您可以下载此远程位置的内容(例如,使用HTTP客户端,例如WebClient类),然后将其作为内容结果返回。例如:

例如,您可以编写一个自定义视图结果来执行此任务:

public class RemoteViewResult : ActionResult
{
    private readonly Uri uri;
    public RemoteViewResult(Uri uri)
    {
        this.uri = uri;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        using (var client = new WebClient())
        {
            using (var stream = client.OpenRead(this.uri))
            {
                var response = context.RequestContext.HttpContext.Response; 
                stream.CopyTo(response.OutputStream);
                response.ContentType = client.ResponseHeaders[HttpResponseHeader.ContentType];
            }
        }
    }
}

然后:

public ActionResult Index()
{
    return new RemoteViewResult(new Uri("http://www.google.com"));
}

答案 1 :(得分:1)

AFAIK你不能那样做。视图必须是您网站中的正确视图。如果您确实不想使用框架来显示外部页面内容,可以尝试使用WebRequest将Html拉回到模型/ ViewBag中,然后将其呈现给本地视图。

这有许多潜在的问题,你需要将原始html渲染到页面,这可能让你对来自外部网站的XSS攻击持开放态度。如果外部页面没有及时响应并且您从外部站点丢失了任何会话控制,它也会遇到超时,它会看到每个请求来自同一个最终用户。

答案 2 :(得分:0)

  

但是如果我想在视图中插入http://google.com [例如?

>该怎么办?

您可以使用<iframe />显示它,也可以使用WebClient拉入HTML服务器端并将其写入视图。两者都没有受到鼓励。