C#MVC显示sharepoint列表中的项目

C#MVC显示sharepoint列表中的项目,c#,asp.net-mvc,sharepoint,C#,Asp.net Mvc,Sharepoint,所以…我创建了一个Sharepoint外接程序(C#MVC)来获取列表信息并创建/更新项目。我以前做过创建/更新,现在不打算解决这个问题 我这里的问题是在MVC视图中显示列表项。到目前为止我所做的-> 我创建了一个模型(类),其中的信息将显示在表中: public class IRFItem { public string Title { get; set; } public string StartDate { get; set; } public string End

所以…我创建了一个Sharepoint外接程序(C#MVC)来获取列表信息并创建/更新项目。我以前做过创建/更新,现在不打算解决这个问题

我这里的问题是在MVC视图中显示列表项。到目前为止我所做的->

我创建了一个模型(类),其中的信息将显示在表中:

public class IRFItem
{
    public string Title { get; set; }
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    //public string CreatedBy { get; set; }
}
在同一个文件中(为了保持测试紧凑),我还添加了一种获取所需项目的方法:

     public static List<IRFItem> GetItems(SharePointContext spContext, CamlQuery camlQuery)
    {

        List<IRFItem> items = new List<IRFItem>();
        //var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext.Current);

        using (var clientContext = spContext.CreateUserClientContextForSPAppWeb())
        {
            if (clientContext != null)
            {
                List irfList = clientContext.Web.Lists.GetByTitle("IRF");
                ListItemCollection irfListItems = irfList.GetItems(camlQuery);
                clientContext.Load(irfListItems);
                clientContext.ExecuteQuery();
                if (irfListItems != null)
                {
                    foreach (var irfListItem in irfListItems)
                    {
                    items.Add(
                        new IRFItem
                        {
                            Title = irfListItem["Title"].ToString(),
                            StartDate = irfListItem["StartDate"].ToString(),
                            EndDate = irfListItem["EndDate"].ToString(),
                        });
                    }
                }
                else
                {
                    items.Add(
                    new IRFItem
                    {
                        Title = "Empty",
                        StartDate = "Empty",
                        EndDate = "Empty"
                    });
                }

            }
        }

        return items;
    }
公共静态列表GetItems(SharePointContext spContext,CamlQuery CamlQuery)
{
列表项=新列表();
//var spContext=SharePointContextProvider.Current.GetSharePointContext(HttpContext.Current);
使用(var clientContext=spContext.CreateUserClientContextForSPAppWeb())
{
if(clientContext!=null)
{
List-irfList=clientContext.Web.Lists.GetByTitle(“IRF”);
ListItemCollection irfListItems=irfList.GetItems(camlQuery);
clientContext.Load(irfListItems);
clientContext.ExecuteQuery();
if(irfListItems!=null)
{
foreach(irfListItem中的var irfListItem)
{
项目。添加(
新伊尔菲坦
{
Title=irfListItem[“Title”].ToString(),
StartDate=irfListItem[“StartDate”]。ToString(),
EndDate=irfListItem[“EndDate”]。ToString(),
});
}
}
其他的
{
项目。添加(
新伊尔菲坦
{
Title=“空”,
StartDate=“空”,
EndDate=“空”
});
}
}
}
退货项目;
}
在我的自定义控制器(称为SharepointController,这样我就不会弄乱默认控制器)中,我添加了这个->

    // GET: Sharepoint
    [SharePointContextFilter]
    public ActionResult Index()
    {

        var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);

        ViewBag.Username = SharePointService.GetUserName(spContext);

        CamlQuery queryProducts = new CamlQuery();
        queryProducts.ViewXml =
           @"<View>  
         <ViewFields><FieldRef Name='StartDate' /><FieldRef Name='LinkTitle' /><FieldRef Name='Title' /><FieldRef Name='Author' /><FieldRef Name='EndDate' /><FieldRef Name='ID' /></ViewFields> 
  </View>";

        List<IRFItem> items = SharePointService.GetItems(spContext, queryProducts);

        //SharePointService.GetItems(spContext, queryProducts);
        return View(items);
    }
//获取:Sharepoint
[SharePointContextFilter]
公共行动结果索引()
{
var spContext=SharePointContextProvider.Current.GetSharePointContext(HttpContext);
ViewBag.Username=SharePointService.GetUserName(spContext);
CamlQuery queryProducts=新的CamlQuery();
queryProducts.ViewXml=
@"  
";
列表项=SharePointService.GetItems(spContext,queryProducts);
//GetItems(spContext、queryProducts);
返回视图(项目);
}
最后,我想要的视图包含->

                    @foreach (AddinTest1Web.Models.IRFItem irfItem in Model)
                    {
                        <tr>
                            <td>@irfItem.Title</td>
                            <td>@irfItem.StartDate</td>
                            <td>@irfItem.EndDate</td>
                        </tr>
                    }
@foreach(模型中的AddinTest1Web.Models.IRFItem-IRFItem)
{
@irfItem.头衔
@伊尔菲特姆起始日期
@irfItem.EndDate
}
我没有收到任何错误,但我的表总是空的……我甚至在GetItems中添加了else部分来创建一个显示为空的项,以便我知道这是与sharepoint相关的问题还是其他问题。老实说,我的MVC经验并不多(一周前才开始学习,但我是那种在实践中学习的人)

有人看到这里有什么问题吗?我遵循了一个教程,做了一些自己的小改动

参考:

任何形式的提示都将非常感谢,谢谢


编辑:我跳过了这个错误,给了应用程序更多的权限(为了安全起见,我可以列出和浏览),并且我正在返回结果,但是我无法创建项目,因为executeQuery没有按时完成。你知道怎么推迟吗?我记得我在过去的任务中遇到了一个大问题,所以我不知道从哪里开始

我会将代码GetItems()移动到单独的Helper类中,然后在其中放置一个断点以查看它是否正在触发

如果您没有收到任何错误,并且返回的数据总是空的,那么这就意味着代码的某些部分没有执行(同步或异步问题?

好吧,所以我修复了这个问题(与此抗争了几个小时,非常简单,我现在就想打自己)

如果有人遇到此问题->

为什么我的列表没有获得任何项目(即使没有ERORR)->没有为应用程序提供足够的权限。通过授予完整列表权限和完整web权限进行修复

为什么我的foreach给出了一个错误->显然有一列的名称不同。我通过尝试这段代码(这显然更好,因为它会抛出一个错误,而不是从列表中获取所有内容)->


我认为应该将问题转移到SharePoint特定的站点,在
foreach(irfListItems中的var irfListItem)
处放置一个调试点,然后查看SharePoint是否在FieldValues中返回任何值。这将是一本字典。嗯……是的。我在调试方面不是很有经验,但我认为看到“计数0”意味着应用程序没有从SP获取任何项目?代码将被执行(我通过尝试获取sharepoint网站名称/描述并将其附加到项目中进行测试)。由于某些原因,获取列表时出现问题……我想我会将此发布到sharepoint stackexchange,也许我会找到遇到类似情况的人。显然代码确实执行了,但它没有足够的权限检索列表项(奇怪的是,我记得它为此提供了一个erorr)。现在我得到了项目,但是foreach进入的太快了,我不能附加任何东西,因为它没有被初始化,你知道我怎样才能延迟吗?
            clientContext.Load(irfListitems, 
                itemss => itemss.Include(
                    item => item["Title"],
                    item => item["StartDate"],
                    item => item["EndDate"]
                    ));