【问题标题】:Using Html.Action causes query string too long error使用 Html.Action 导致查询字符串太长错误
【发布时间】:2013-11-08 00:34:28
【问题描述】:

我有一个 _LayoutView:

@{
    Layout = "~/Views/Shared/_NavLayout.cshtml";
}
@section styles
{
    @RenderSection("styles", required: false)
}
<div class="container" style="padding-top: 60px;">
    <div class="row">
        <div class="col-md-12">
              @Html.Action("AccountNavigation")  
        </div>
    </div>
    @RenderSection("InlineTitle", required:false)
    @RenderBody()
</div>


@section scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @RenderSection("scripts", required: false)
}

如果我删除它会很好

 @Html.Action("AccountNavigation")

否则我会得到:

动作方法是:

 [ChildActionOnly]
    public ActionResult AccountNavigation()
    {
        var roles = UserManager.GetRoles(User.Identity.GetUserId());
        ViewBag.IsAdmin = roles.Contains("Admin");
        return PartialView("_AccountNavigatorPartial");
    }

我尝试将其剥离为:

 [ChildActionOnly]
        public ActionResult AccountNavigation()
        {

            ViewBag.IsAdmin = false;
            return null; 
        }

但这并没有什么区别。

使用该布局的子视图之一是 Login。

   [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.OidLoginFailed = false;
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

如果我在其中放置一个中断点,我可以看到它在每个请求中被多次调用并建立 ReturnUrl 直到它失败,因此出现错误消息。这就是我剥离 AccountNavigation ActionMethod 的原因。

我认为可能是 anon 请求通过一些配置设置导致回发,如果 Anon 重定向到 Login 并循环它会去,但我看不到触发的位置。

帐户 _AccountNavigatorPartial 只是:

 <ul class="nav navbar-nav navbar-Left">
     <li>@Html.ActionLink("Manage Credentials", "Credentials", "Account", 
             routeValues: null, htmlAttributes: new { id = "credentialsLink" })</li>
     <li>@Html.ActionLink("Manage Profile", "Profile", "Account", 
             routeValues: null, htmlAttributes: new { id = "credentialsLink" })</li>
 </ul>

所以我要做的就是注入一些用于帐户导航的 html。我正在使用 ASP.Identity 作为成员资格,但我看不出这有什么不同,因为我正在请求一个匿名可访问页面。

【问题讨论】:

  • 我不确定你在问什么,因为它与我的问题有关?登录视图有一个回发的表单,但我什至无法呈现初始 GET 来回发。上面的 GET 就是这样,当表单被提交时,它正在发布。但如上所述,我不确定我是否明白你的意思?

标签: c# asp.net asp.net-mvc-4 asp.net-identity


【解决方案1】:

如果没有看到控制器并知道您是如何处理授权的,很难判断,但是,由于您的登录页面正在使用该布局,您可能会因为子操作的授权失败而遇到循环调用。

您是否尝试将属性[AllowAnonymous] 添加到您的子操作中?

【讨论】:

  • 好的,这很尴尬。我将一些代码重构到这个控制器中,实际上它在类级别上有 [Authorize]。但显然我没有考虑到我的想法,而且果然这就是循环引用被驱动的地方。因此,AllowAnonymous 为我提供了此操作所需的覆盖。非常感谢。
【解决方案2】:

我们得到了类似的UriFormatException: Invalid URI: The Uri string is too long. - 我们发现解决方案是将模型作为显式参数传入,而不仅仅是典型的方法。

不工作

@Html.Action("MyChildAction", "Path", Model)

工作

@Html.Action("MyChildAction", "Path", new { viewModel = Model} )

这似乎是通过使用非常大的视图模型触发的 - 这必须将其包装并绕过导致缓冲区溢出的编码问题 UriHelper.EscapeString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多