【问题标题】:Controller returning 302 in release控制器在发布时返回 302
【发布时间】:2022-01-25 02:37:59
【问题描述】:

我遇到了 ASP.NET MVC 的问题。我的 POST 控制器方法在 localhost 和测试环境中运行良好,但在登台和生产中,控制器返回 302 状态代码。

之前,控制器是 PUT,返回是 Ok(),但我改为 ReturnToAction()。我无法理解发生了什么......

这是我的控制器:

    [Authorize]
    public async Task<IActionResult> Index()
    {
        var filialOriginId = await _user.GetOriginFilial();

        if (filialOriginId == null)
            return View(@"Views/Company/NotFound.cshtml");

        var company = await _companyApplicationService.GetByOriginId(filialOriginId);

        return View(company);
    }

    [Authorize]
    [Route("save-company-options")]
    [HttpPost]
    public async Task<IActionResult> SaveCompanyOptions(RegisterCompanyOptionViewModel registerCompanyOptionViewModel)
    {
        var filial = await _companyApplicationService.GetByOriginId(await _user.GetOriginFilial());
        var company = await _companyApplicationService.RegisterOptions(filial.Id, registerCompanyOptionViewModel);

        return RedirectToAction("Index");
    }

这是我的观点:

<form asp-controller="Settings" asp-action="SaveCompanyOptions" method="post">
<section class="container">
    <div class="card">
        <div class="panel__title">
            Configurações
        </div>
        <p class="panel_description">Escolha o endereço da sua página, fontes e cores</p>


        <div class="panel_content flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="sm__100 md__100 lg__33 xl__33">
                <div id="Url__field"
                     class="form-floating has-preffix">
                    <input id="inputUriName"
                           class="form-control"
                           type="text"
                           aria-label="Personalizar URL"
                           aria-describedby="Personalizar URL"
                           placeholder="Personalizar URL"
                           asp-for="@Model.UriName"
                           required />
                    <label class="form-label" for="inputUrlPagina">Personalizar URL</label>
                    <span class="input__preffix">@AppSettingsConfiguration.UrlBNE.Replace("https://", "")/jobs/</span>
                    <div class="invalid-feedback"></div>
                </div>
            </div>

            <div class="sm__100 md__50 lg__33 xl__33">
                <div class="form-floating">
                    <select class="form-select"
                            id="selectTypography"
                            asp-for="Typography"
                            required>
                    </select>
                    <label for="selectTypography">Tipografia</label>

                    <script>
                        setTimeout(function () {
                            $("#selectTypography option[value='@Model.Typography']").prop('selected', true);
                        }, 1000);

                    </script>
                </div>
            </div>

            <div class="sm__100 md__50 lg__33 xl__33">
                <div id="InputColor" class="form-floating">
                    <input id="ChangeColor"
                           class="form-control"
                           type="text"
                           aria-label="Alterar Cor"
                           aria-describedby="Altrar Cor"
                           placeholder="Alterar Cor"
                           asp-for="Color"
                           value="@(string.IsNullOrEmpty(Model.Color) ? "#00796B" : Model.Color)" />


                    <label class="form-label" for="selectTypography">Alterar Cor</label>
                </div>
            </div>
        </div>
    </div>
</section>

<section id="Description" class="container">
    <div class="card">
        <div class="flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="panel__title">
                Como é trabalhar na @Model.Name?
                <div class="form-check form-switch">
                    @Html.CheckBoxFor(m => m.ShowTitle,new { @class="form-check-input"} )
                    <label class="form-check-label" for="checkHow"></label>
                </div>
            </div>
        </div>
        <p class="panel_description">Escolha o endereço da sua página, fontes e cores</p>
        <div class="form-floating panel_content">
            <textarea id="HowIsText" class="editor" asp-for="Title">@Model.Title</textarea>
        </div>
    </div>
</section>

<section class="container">
    <div class="card ">
        <div class="flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="panel__title">
                Video institucional
                <div class="form-check form-switch">
                    @Html.CheckBoxFor(m => m.ShowVideo,new { @class="form-check-input"} )
                    <label class="form-check-label" for="ckechVideo"></label>
                </div>
            </div>
            <p class="panel_description">Sua empresa tem um vídeo sobre a cultura interna? Mostre-o aqui</p>
        </div>
        <div class="panel_content flex flex-wrap">
            <div class="sm__100 md__100 lg__50 xl__50">
                <div class="form-floating">
                    <input id="urlVideo"
                           class="form-control"
                           type="text"
                           aria-label="Link do Vídeo"
                           aria-describedby="Link do Vídeo"
                           placeholder="Link do Vídeo"
                           value="@Model.UrlVideo"
                           asp-for="UrlVideo"
                           required />
                    <label class="form-label" for="inputNome">Link do Vídeo</label>
                    <div class="invalid-feedback">
                    </div>
                </div>
            </div>
            <div class="sm__100 md__100 lg__50 xl__50">
                <div class="form-floating">
                    <input id="urlChannel"
                           class="form-control"
                           type="text"
                           aria-label="Link do Canal"
                           aria-describedby="Link do Canal"
                           placeholder="Link do Canal"
                           value="@Model.TwitterUrl"
                           asp-for="TwitterUrl"
                           required />
                    <label class="form-label" for="inputNome">Link do Canal</label>
                    <div class="invalid-feedback">
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

<section class="container Media d-none">
    <div class="card ">
        <div class="flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="panel__title">
                Video institucional
                <div class="form-check form-switch">
                    @Html.CheckBoxFor(m => m.ShowSubtitle,new { @class="form-check-input"} )
                    <label class="form-check-label" for="checkWhy"></label>
                </div>
            </div>
            <p class="panel_description pb-3">Sua empresa tem um vídeo sobre a cultura interna? Mostre-o aqui</p>
        </div>
        <div class="form-floating panel_content">
            <textarea id="whyWork" class="editor" asp-for="Subtitle">@Model.Subtitle</textarea>
        </div>
    </div>
</section>

<section class="container">
    <div class="card ">
        <div class="flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="panel__title">
                Profissões que contratamos
                <div class="form-check form-switch">
                    @Html.CheckBoxFor(m => m.ShowJobs,new { @class="form-check-input"} )
                    <label class="form-check-label" for="checkJobs"></label>
                </div>
            </div>
        </div>
        <p class="panel_description pb-3">Exibir lista de vagas na sua página inicial</p>
    </div>
</section>

<section class="container d-none">
    <div class="card">
        <div class="flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="panel__title">
                Dúvidas Frequentes
                <div class="form-check form-switch">
                    @Html.CheckBoxFor(m => m.ShowFaq,new { @class="form-check-input"} )
                    <label class="form-check-label" for="checkFAQ"></label>
                </div>
            </div>
        </div>
    </div>
</section>

<section class="container">
    <div class="card  flex flex__wrap sm__100 md__100 lg__100 xl__100">
        <div class="flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="panel__title">
                Redes Sociais
                <div class="form-check form-switch">
                    @Html.CheckBoxFor(m => m.ShowSocial,new { @class="form-check-input"} )
                    <label class="form-check-label" for="checkSocial"></label>
                </div>
            </div>
            <p class="panel_description">Escolha o endereço da sua página, fontes e cores</p>
        </div>

        <div class="panel_content flex flex__wrap sm__100 md__100 lg__100 xl__100">
            <div class="sm__100 md__50 lg__25 xl__25">
                <div class="form-floating">
                    <input id="socialFb"
                           class="form-control"
                           type="text"
                           aria-label="Facebook"
                           aria-describedby="input-Facebook"
                           placeholder="Facebook"
                           value="@Model.FacebookUrl"
                           asp-for="FacebookUrl"
                           required />
                    <label class="form-label" for="inputNome">Facebook</label>
                    <div class="invalid-feedback">
                    </div>
                </div>
            </div>
            <div class="sm__100 md__50 lg__25 xl__25">
                <div class="form-floating">
                    <input id="socialLi"
                           class="form-control"
                           type="text"
                           aria-label="Linkedin"
                           aria-describedby="input-Linkedin"
                           placeholder="Linkedin"
                           value="@Model.LinkedinUrl"
                           asp-for="LinkedinUrl"
                           required />
                    <label class="form-label" for="inputNome">Linkedin</label>
                    <div class="invalid-feedback">
                    </div>
                </div>
            </div>
            <div class="sm__100 md__50 lg__25 xl__25">
                <div class="form-floating">
                    <input id="socialIg"
                           class="form-control"
                           type="text"
                           aria-label="Instagram"
                           aria-describedby="input-Instagram"
                           placeholder="Instagram"
                           value="@Model.InstagramUrl"
                           asp-for="InstagramUrl"
                           required />
                    <label class="form-label" for="inputNome">Instagram</label>
                    <div class="invalid-feedback">
                    </div>
                </div>
            </div>
            <div class="sm__100 md__50 lg__25 xl__25">
                <div class="form-floating">
                    <input id="socialTw"
                           class="form-control"
                           type="text"
                           aria-label="Twitter"
                           aria-describedby="Twitter"
                           placeholder="Twitter"
                           value="@Model.TwitterUrl"
                           asp-for="TwitterUrl"
                           required />
                    <label class="form-label" for="inputNome">Twitter</label>
                    <div class="invalid-feedback">
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="btn__company">
        <button id="btnSaveCompanyOptions" onclick="saveAllSettings()" type="submit">SALVAR ALTERAÇÕES</button>
    </div>
</section>
</form>

【问题讨论】:

  • 302 是 RedirectToAction 所做的重定向
  • 是的,但为什么本地控制器工作正常?
  • 什么不起作用?您的浏览器应遵循重定向。你是说没有?
  • 是的,控制器需要执行方法,完成后,她需要重定向到Index。在测试和本地方面,她工作得很好,但在分期和生产方面却不行。对不起我的英语不好。
  • 浏览器应该在本地和生产中遵循服务器重定向指令。实际问题是什么?您是否对操作进行 API 类型调用?在您看来saveAllSettings() 方法中可能是一个问题,但您没有显示该代码

标签: c# html asp.net-mvc http controller


【解决方案1】:

您正在使用执行重定向的return RedirectToAction("Index");。 302 是重定向的 Html 状态码。

如果您不想执行重定向,可以尝试直接从 HttpPost 操作返回 Index 视图(并包括公司模型):

[Authorize]
[Route("save-company-options")]
[HttpPost]
public async Task<IActionResult> SaveCompanyOptions(RegisterCompanyOptionViewModel registerCompanyOptionViewModel)
{
    var filial = await _companyApplicationService.GetByOriginId(await _user.GetOriginFilial());
    var company = await _companyApplicationService.RegisterOptions(filial.Id, registerCompanyOptionViewModel);

    return View("Index", company);  // return Index view here
}

return View("Index", company); 直接从 HttpPost SaveCompanyOptions 操作返回索引视图。由于您要从不同的操作返回视图,因此您需要提供视图所需的所有数据 - 这就是我们在此处将 company 对象传递给视图的原因。

return RedirectToAction("Index"); 执行重定向,该重定向调用 Index() 操作,就好像它是一个新请求一样。

【讨论】:

  • 啊啊啊,现在我明白了。路由工作正常并返回正确,我检查了标题并且位置标题指向索引路由,但是为什么重定向没有发生?
  • @bini 这行return View("Index", company); 直接从HttpPost SaveCompanyOptions 操作返回Index 视图。如果您从不同的操作返回视图,您需要提供视图所需的所有数据 - 这就是我们将company 对象传递给此处的视图的原因。以前,您正在执行重定向,它调用 Index() 操作,就好像它是一个新请求一样。
  • 是的,我在这里试过,但我不想在这条路线上返回视图,我需要重定向到索引路线。有没有办法在不返回 302 状态码的情况下返回重定向?
  • 您还没有解释使用 RedirectToAction 的问题是什么?重定向时有什么问题? @bini
  • 对不起,问题是路由没有保存数据,看起来浏览器会立即重定向到位置标头 url。我认为我们的服务器中有一些配置,但我无权确认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多