首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在序列化视图时断开链接

在序列化视图时断开链接
EN

Stack Overflow用户
提问于 2015-08-14 20:40:10
回答 1查看 316关注 0票数 6

我将以下内容作为填充局部视图的View Model的一部分:

代码语言:javascript
复制
public string DownloadLink
{
    get
    {
        UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
        switch (this.Type)
        {
            case (int)DocumentTypes.WasteNote: { 

                return url.Action("PaperWork", "Jobs", new { JobId = this.DOCJobId }, HttpContext.Current.Request.IsSecureConnection ? "https" : "http" ); 
            }
            case (int)DocumentTypes.Contract:
            case (int)DocumentTypes.DestructionCert:
            case (int)DocumentTypes.Quote:
            default: { return url.Action("Download", "Documents", new { DocId = this.DocumentLinkId }, HttpContext.Current.Request.IsSecureConnection ? "https" : "http"); }
        }
    }
}

在视图中调用如下所示:

代码语言:javascript
复制
@model  IEnumerable<Document>
@using CustomerDashboard.ViewModels;
@using CustomerDashboard.Utilities;
@{ Layout = null; }
    @foreach (Document doc in Model)
    {
        <li>
            <a href="@doc.DownloadLink" class="documentDownload">
                <div class="col-sm-12 col-md-5 li-row li-row-icon">
                    <div class="pull-left">
                        <img height="40" src="/Content/img/file-icons/@doc.Icon" />
                    </div>
                    ...
             </a>
        </li>
    }

虽然这是直接在另一个视图中呈现生成的链接,但是,我序列化部分并作为JSON返回:

代码语言:javascript
复制
public string RenderRazorViewToString(string viewName, object model)
    {
        //https://gist.github.com/timiles/2828976 
        ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
                                                                     viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View,
                                         ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }

然后将其作为Json从控制器返回:

代码语言:javascript
复制
        return Json(new { 
            totalCount = (int)Session["DocumentTotalCount"], 
            markup = RenderRazorViewToString("_DocumentListAjax", docs) 
        },JsonRequestBehavior.AllowGet);

但要清楚的是,问题发生在JSON序列化之前-这很糟糕,但删除了www前缀:

代码语言:javascript
复制
        return Json(new { 
            totalCount = (int)Session["DocumentTotalCount"], 
            markup = RenderRazorViewToString("_DocumentListAjax", docs).Replace("www.","") 
        },JsonRequestBehavior.AllowGet);

当这样做的时候,从似乎来自局域网外部的东西(听起来很奇怪),所有的urls都有www前缀- ie https://example.com变成了https://www.example.com。我正在努力追查为什么会发生这种情况,以及如何修复它。

EN

回答 1

Stack Overflow用户

发布于 2015-08-22 05:55:19

使用您的代码,所描述的行为只能在为不同的请求提供服务时发生。在另一个视图中呈现部分视图必须作为处理其上下文的主机被设置为example.com的http请求的结果(例如,对https://example.com/viewWithAPartialView的请求)。

另一方面,包含部分视图的Serving是在处理对www.example.com的请求(例如,对https://www.example.com/getPartialViewJson/partialViewName的请求)后完成的。

由于在主视图中渲染局部视图可能是在通过“正常”url浏览网站时完成的,所以一切都按计划进行。

JSON端点可能是通过AJAX查询的,请检查形成请求的代码-它是罪魁祸首。另一种可能是,您将URL重写设置为剥离www前缀,并且由于某些原因,重写规则与JSON服务端点不匹配。

更新:

根据其他信息,该问题可能与主机配置(IIS和负载均衡器设置)有关。我可以建议的是尝试将以下行添加到web.config文件中:

代码语言:javascript
复制
<appSettings>
  ...
  <add key="aspnet:UseHostHeaderForRequestUrl" value="true" />
  ...
</appSettings>

这将强制ASP.NET使用来自传入请求的主机头,而不是请求服务器名称变量。如果问题的原因确实是配置问题,这应该会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32010366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档