【发布时间】:2014-05-28 08:00:40
【问题描述】:
我正在 MVC 4.5 中构建一个小型应用程序。我有一个 Azure 数据库,我首先使用代码和实体框架来设置它。该应用程序托管在我的开发共享点区域中。
Home 控制器的Index() 操作具有[SharePointContextFilter] 并加载登录用户的用户名等。调试应用程序并运行第一个操作时,Sharepoint {StandardTokens} 会附加到 url,因此 SPHostUrl 和 AppWebUrl 以及一些其他变量会添加到查询字符串中。
如果我导航到没有[SharePointContextFilter] 的操作,它工作正常,直到我导航回操作 [SharePointContextFilter]。然后我收到一条错误消息:
Unknown User
Unable to determine your identity. Please try again by launching the app installed on your site.
我认为这是因为缺少一些 Sharepoint {StandardTokens},因为如果我像这样手动将它们附加到链接:
@Url.Action("Index", "Home", new { SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Current.Request).AbsoluteUri })
并用[SharePointContextFilter] 标记其他操作,它仍然有效。
悬停这似乎是解决这个问题的一种不必要的复杂方法。我不想用[SharePointContextFilter] 标记我的应用程序中的每一个操作,并手动将{StandardTokens} 插入到我创建的每个链接的查询字符串中。难道不能以某种方式将此信息保存到会话或 cookie 中,所以我不必这样做吗?
供参考,这里有一些代码:
HomeController.Index(),第一个运行的Action。
[SharePointContextFilter]
public ActionResult Index()
{
User spUser = null;
var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
using (var clientContext = spContext.CreateUserClientContextForSPHost())
{
if (clientContext != null)
{
spUser = clientContext.Web.CurrentUser;
clientContext.Load(spUser, user => user.Title);
clientContext.ExecuteQuery();
ViewBag.UserName = spUser.Title;
}
}
return View();
}
这是[SharePointContextFilter] 属性(由Visual Studio 生成):
/// <summary>
/// SharePoint action filter attribute.
/// </summary>
public class SharePointContextFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
SharePointContext currentContext = SharePointContextProvider.Current.GetSharePointContext(filterContext.HttpContext);
Uri redirectUrl;
switch (SharePointContextProvider.CheckRedirectionStatus(filterContext.HttpContext, out redirectUrl))
{
case RedirectionStatus.Ok:
return;
case RedirectionStatus.ShouldRedirect:
filterContext.Result = new RedirectResult(redirectUrl.AbsoluteUri);
break;
case RedirectionStatus.CanNotRedirect:
filterContext.Result = new ViewResult { ViewName = "Error" };
break;
}
}
}
我使用的链接。来自 _Layout.cshtml 文件。:
<li id="Home"><a href="@Url.Action("Index", "Home", new { SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Current.Request).AbsoluteUri })">Home</a></li>
<li id="Contract"><a href="@Url.Action("Index", "Contract", new { SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Current.Request).AbsoluteUri })">Avrop</a></li>
如果我尝试使用标记为[SharePointContextFilter] 过滤器的 操作中的这些链接,则找不到SPHostUrl。如果我尝试链接到 标记有[SharePointContextFilter] 过滤器的操作,如果不包含SPHostUrl,我会收到上述错误。
这基本上创造了一种情况,我可以离开过滤的操作,但我永远无法返回它们。
我希望这已经足够清楚了。
【问题讨论】:
标签: c# asp.net asp.net-mvc asp.net-mvc-4 sharepoint