0

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

我尝试使用Html.ActionLink和使用ControllertoRedirect到 URL,但它重定向页面而不是更改内部View.

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

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

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

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

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

4

3 回答 3

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"));
}
于 2013-06-17T15:05:13.663 回答
1

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

这有许多潜在的问题,您需要将原始 html 呈现到页面,这可能会使您容易受到来自外部站点的 XSS 攻击。此外,如果外部页面没有及时响应并且您失去了来自外部站点的任何会话控制,您可能会遇到超时,它会将每个请求都视为来自同一最终用户。

于 2013-06-17T15:05:26.897 回答
0

但是,例如,如果我想在视图中插入http://google.com [in] 怎么办?

您可以使用<iframe />或通过使用 WebClient 拉入 HTML 服务器端并将其写入您的视图来显示它。都不鼓励。

于 2013-06-17T15:04:49.000 回答