2014-09-05 17 views
6

Tôi đang xây dựng một ứng dụng góc được chạy như một nguồn tài nguyên web trên Dynamics 2013.Dynamics 2013 Truy cập trang đơn vị khó có thể truy cập với tầm iframe dựa

Ứng dụng này chạy bằng cách sử dụng nút đó sẽ được thêm vào commandContainer sử dụng Ribbon bàn làm việc mà sau đó nút mà các cuộc gọi một Xrm.Internal.openDialog

Tất cả điều này hoạt động tốt cho đến khi tôi muốn bắt đầu sử dụng Đối tượng tiếp xúc bởi Xrm.Page.Data

về cơ bản nút chạy của tôi trong bối cảnh trang chính của động lực tuy nhiên Entities là bên trong một khung nội tuyến dựa trên trên trang tôi đang ở có một Id và tên khác.

Vì vậy, bằng cách sử dụng công cụ chọn đơn giản, tôi không thể lấy nội dung của nóWindow và bắt đầu sử dụng Thực thể.

#crmContentPanel luôn có vài iframe trong nó bắt đầu từ # contentIFrame0 đến #contentIFrame (n) và tôi không bao giờ biết iframe nào là iframe có Entities trong đó.

Thực hành tốt nhất, luồng công việc liên quan với việc phát triển ứng dụng trong môi trường này là gì? Làm thế nào tôi có thể dễ dàng và đáng tin cậy truy cập vào khung chính xác mà giữ các thực thể trang chính và làm việc với họ.

Có lẽ tập lệnh ở sai vị trí và cần được đưa vào khu vực nội dung chính để có quyền truy cập trực tiếp vào đúng Xrm? Làm thế nào tôi có thể đạt được điều đó? Hơn nữa một khi tôi cuối cùng quản lý để truy cập dữ liệu này, làm thế nào tôi có thể dễ dàng chuyển dữ liệu này đến ứng dụng góc của tôi chạy trong hộp thoại từ tài liệu tôi đọc rằng hộp thoại chỉ được phép 1 tham số chuỗi truy vấn và nó phải được gọi là dữ liệu. Điều đó sẽ không đủ cho ứng dụng của tôi để bắt đầu sử dụng $routeParams. Và tôi không nghĩ rằng việc sử dụng bộ nhớ cục bộ hoặc phiên là phương pháp hay. Cách tiếp cận chính xác trong tình huống này là gì. đang

Mẫu nút kịch bản của tôi:

function runSendSender() { 

    // Content Iframe Entity data: 
    var contentFrameXrm = $('#crmContentPanel') 
         .find("iframe#contentIFrame0...n")[0] 
         .contentWindow['Xrm']; 

    // even if above selector was consistent across pages 
    // I need to send over much more than this one Id :(
    var data = contentFrameXrm.Page.data.entity.getId(); 

    var src = "/WebResources/concep_/ConcepDynamicsApp/ConcepDynamicsApp.html?data=" + data; 
    var DialogOptions = new Xrm.DialogOptions(); 
    DialogOptions.width = 800; 
    DialogOptions.height = 500; 
    Xrm.Internal.openDialog(src, DialogOptions, null, null, CallbackFunction); 

    function CallbackFunction(returnValue) { } 
} 

Ít chi tiết hơn

Khi tôi gõ như sau trong giao diện điều khiển tôi có thể thỉnh thoảng (ngẫu nhiên) đọc tiêu đề có dạng:

$('#crmContentPanel').find("iframe#contentIFrame0")[0].contentWindow['Xrm'].Page.ui.get_formTitle(); 

Nhưng cùng một mã từ chức năng tài nguyên web được liên kết không thể truy cập iframe và lỗi:

Can not Cannot read property 'contentWindow' of undefined. 

Tại sao iframe không thể truy cập thông qua tập lệnh tài nguyên và cách tôi có thể truy cập đúng ngữ cảnh và tiêu đề/id biểu mẫu.

+1

Bạn không có quyền truy cập trở lại các thực thể CRM qua XRM. Khi bạn viết JavaScript trên một biểu mẫu, bạn sử dụng 'Xrm.Page.Data' để thao tác dữ liệu trên biểu mẫu cho thực thể đó. Webresource của bạn cần sử dụng id bạn đang truyền nó để tải các dữ liệu cần thiết (thường được thực hiện thông qua OData) và tiến hành từ đó. – Nicknow

+0

Xin chào Nick, cảm ơn nhưng vấn đề tương tự là viết tắt của việc nhận Id từ Xrm khi tập lệnh chạy trong ngữ cảnh của trang đầu nhưng Xrm có thông tin id của biểu mẫu nằm bên trong iframe khác không có id cố định trên các trang trong động lực học. Làm thế nào để tôi nhận được id một cách nhất quán? – XGreen

Trả lời

3

Id bản ghi có thể được gửi đến runSendSender làm thông số bằng chính dải băng. Chỉ cần thêm CrmParameter (MSDN) thích hợp vào cuộc gọi chức năng.

Trong trường hợp của bạn, giá trị tham số sẽ FirstPrimaryItemId ("Cung cấp một định danh GUID như là một chuỗi cho các hồ sơ đang được xem.")

Sau đó, bạn sẽ phải thay đổi chức năng của bạn như thế này

function runSendSender(recordId) { ... } 

Ngoài ra, hãy thoát ra khỏi nội bộ: để mở tài nguyên web trong hộp thoại, bạn nên sử dụng the supported way (liên kết cung cấp thông tin về các tham số truyền khác với tài nguyên) data.

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height) 
5

Tôi thường kể cả sau tập tin Javascript để tiêu đề của WebResource tùy chỉnh mà cần phải có quyền truy cập vào CRM cụ thể hành động/thông tin:

<script src="ClientGlobalContext.js.aspx" type="text/javascript"></script> 

Điều này cho phép truy cập vào một số thông tin cụ thể không có thực thể chẳng hạn như Xrm.Page.context.getServerUrl() hoặc Xrm.Page.context.getUserId() chẳng hạn.

Nhưng nếu bạn thêm lớp với riêng iFrame của bạn trên đầu trang tổ chức tiêu chuẩn, bạn chắc chắn có thể truy cập vào thông tin bên dưới bối cảnh hiện tại của bạn bằng cách sử dụng xây dựng sau đây:

window.parent.Xrm.Page.data.entity.attributes.get("name").getValue(); 

Note tiền tố window.parent.

Các vấn đề liên quan