将自定义信息添加到 Office 365 中的日历项目

Add custom information to an calender item in Office365

我们将自己的应用程序与 Office 365 日历集成。在我们的应用程序中,我们创建了可以从 Outlook 查看的日历项目,其中可以通过 Outlook 加载项访问额外的信息和操作。我们想将我们自己的信息添加到最终用户不可见的日历项中,以控制 outlook 添加。

有没有办法将我们自己的数据添加到 Office 365 中的日历项目?

这可以通过 OpenTypeExtensionModel 实现。您可以在以下位置找到更多信息 https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/opentypeextension_post_opentypeextension

示例: 要在日历项目上创建扩展,您首先需要制作一个包含信息并继承自 OpenTypeExtensionModel 的 class。在下一个示例代码中,我创建了一个 OpenTypeExtensionModel 抽象调用,我自己的 class 数据 BookingExtention 继承自该调用。我有一个包含信息的枚举(在这种情况下,我使用日历项作为预订,这定义了预订类型):

public abstract class OpenTypeExtensionModel
{
    [JsonProperty("@odata.type")]
    public string Type { get { return "Microsoft.Graph.OpenTypeExtension"; } }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Id { get; set; }
    public string ExtensionName { get; set; }
}

public enum ItemType
{
    Booking,
    Reservation,
    Option
}

public class BookingExtension : OpenTypeExtensionModel
{
    public ItemType ItemType { get; set; }

    public BookingExtension(string extensionName)
    {
        Id = Guid.NewGuid().ToString();
        ExtensionName = extensionName;
    }
}

获得这些 classes 后,您可以使用以下代码将其添加到日历项目中:

        private EventModel CreateOutlookEvent(string subject, string body)
    {
        Models.EmailAddress EventOrganizer = new Models.EmailAddress { address = "a@b.c", name = "Donald Trump" };
        Models.EmailAddress EventAttendee = new Models.EmailAddress { address = "x@y.z", name = "Hilary Clinton" };

        EventModel outlookEvent = new EventModel();
        outlookEvent.body = new EventBody { contentType = "Text", content = body };
        outlookEvent.subject = subject;
        outlookEvent.start = new Models.DateTimeTimeZone
        {
            DateTime = DateTime.Now
        };
        outlookEvent.end = new Models.DateTimeTimeZone
        {
            DateTime = DateTime.Now.AddHours(1)
        };
        outlookEvent.attendees = new List<Models.Attendee>();
        outlookEvent.attendees.Add(new Models.Attendee { emailAddress = EventAttendee });
        outlookEvent.isOrganizer = false;
        outlookEvent.organizer = new Organizer() { emailAddress = EventOrganizer };

        var extension = new BookingExtension("mindPark.Extensions.Booking")
        {
            ItemType = ItemType.Option
        };

        outlookEvent.extensions = new List<BookingExtension>();
        outlookEvent.extensions.Add(extension);
        return outlookEvent;
    }

并且使用此代码,您可以创建一个事件并 post 它 O365

    public async Task<ActionResult> CreateEvent()
    {
        EventModel outlookEvent = CreateOutlookEvent("Debat", "Are you in for a debate?");
        await PostOutLookEvent(outlookEvent);

    }

    private async Task PostOutLookEvent(EventModel outlookEvent)
    {
        var accessToken = (string)Session["access_token"];
        HttpClient httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri("https://graph.microsoft.com/");
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var request = new HttpRequestMessage(HttpMethod.Post, "beta/me/events");
        request.Content = new StringContent(JsonConvert.SerializeObject(outlookEvent), Encoding.UTF8, "application/json");


        HttpResponseMessage response = await httpClient.SendAsync(request);
        if (response.IsSuccessStatusCode)
        {
            string s = await response.Content.ReadAsStringAsync();
        }
    }