網上的中文文章(比如這篇文章)都是寫的部署到服務器后出現的問題,同時也指出要把crystal report的aspnet_client文件夾拷貝到對應項目的根目錄里,這樣就可以正常顯示了,但是具體到我本人的情況,還是無法只通過拷貝aspnet_client這個文件夾就可以解決問題。所以在中文搜索無果的情況下,通過英文搜索關鍵字 bobj is undefined后,最終解決問題。這里列出參考鏈接,stackoverflow中這個問題給出了原因解釋,這篇文章給出了修改web.config文件解決方案,不過其中在設置url中的地方有點問題,需要參考這篇文章;另一篇文章則給出了在引入了水晶報表的aspx中,通過指定相應的script標簽正確引入bobj對象解決問題。
先說一下,我的開發環境是VS2012,水晶報表使用的是CRforVS_13_0_5這個exe,操作系統是win10。基本上,在安裝完crystal report之后,會在C盤中多出一個inetpub文件。
網上說的把aspnet_client文件夾拷貝到對應項目的根目錄中是解決bobj is undefined問題的第一步。其實,如果是要顯示水晶報表的話,估計只用引入crystalreportviewers13這個文件就可以,不過為了避免不必要的麻煩,建議還是引入aspnet_client這整個文件夾比較好。把項目引入之后,如果你這樣就不會彈出“bobj未定義”並可以直接看到報表出來的話,就可以不用往下看了,如果仍然彈出錯誤“bobj 未定義”,那么恭喜你,可以繼續往下看了。
如果繼續報錯,那么根據之前我列的兩種方式來做,是都可以解決的,不過解決中要注意下相關情況。這里,我把兩種解決方式都列出來了。
第一:修改web.config,在你的web.config中,需要在<sectionGroup>中添加<section>節點,內容如下:
<section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler"></section>
如果你連前一個crystalreports的<sectionGroup>節點也沒有的話,可以手動添加(我是手動添加的),內容如下:
<configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="rptBuildProvider" type="CrystalDecisions.Shared.RptBuildProviderHandler, CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, Custom=null"/> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler"></section> </sectionGroup> </sectionGroup> </configSections>
其中,黃色的就是上面在<section>節點中葯添加的內容。之后,在web.config中,<businessObjects>節點中添加如下節點:
<crystalReportViewer> <add key="ResourceUri" value="/aspnet_client/system_web/4_0_30319/crystalreportviewers13"/> </crystalReportViewer>
這里,標黃的節點的value屬性中內容填寫你引入文件的相對路徑。之前列的那片說的修改web.config文章里,就是在這個地方有點兒問題,他那里說要加“~”這個符號,實際上是不能加的(我這里是這樣,如果加了還是報錯),我也給出了相關解決辦法的文章,里面就指出了不能加“~”。如果你跟我一樣,也是連<businessObjects>節點都沒有的話,可以手動添加,內容如下:
<businessObjects> <crystalReports> <rptBuildProvider> <add embedRptInResource="true"/> </rptBuildProvider> <crystalReportViewer> <add key="ResourceUri" value="/aspnet_client/system_web/4_0_30319/crystalreportviewers13"/> </crystalReportViewer> </crystalReports> </businessObjects>
其中,黃色的就是上面在要添加的內容。
第二種方式,就是直接在相關aspx中添加對應的script標簽引入crv.js文件了,具體如下:
<head runat="server"> <title></title> <script src='<%=ResolveUrl("~/crystalreportviewers13/js/crviewer/crv.js")%>' type="text/javascript"></script> </head>
這里解釋一下,bobj對象是定義在crv.js這個文件中的
,而如果不引入這個文件,自然找不到bobj這個對象了,通過瀏覽器也可以看見,如果沒有引入,請求的文件是找不到的。
引入之后,可以看到,文檔加載成功,然后在HTML中也添加了
之前設置web.config的原因也是為了引入crv.js。
而且,其實在ResolveUrl中的地址中也可以不加“~”符號,為了於web.config保持一致,建議不加,這里列出來的原因,主要是參考的文章也加了。至此,就解決了我的關於bobj is undefined問題。在這兩個方法中,我個人是建議設置web.config文件的,這樣,可以把一票的相關js文件引入進來,省得在出現別的對象找不到的問題。希望看到這篇文章的朋友,這個文章能夠對你有所幫助。