Попробуйте использовать контроллер вместо этого, и пусть ваш CustomerChange ActionResult задает [Route ()].Я использую контроллер для большинства своих элементов макета, таких как корзины покупок, локализация и т. Д. ... на бритвенных страницах, и работает довольно хорошо.
// Обновлен ответ на основе отзывов Стивена Б.
Ниже приведен пример локализации, о которой я говорил выше.Форма запускает публикацию по методу SetLanguage в BaseController.cs
В файле _Layout.cshtml у меня есть, в данном случае, частичное представление:
@Html.Partial("_SetLanguagePartial") // Used prior to .net core 2.1
<partial name="_SetLanguagePartial" /> // Used for .net core 2.1+
HTML внутри этого_SetLanguagePartial.cshtml содержит форму с соответствующим asp-контроллером и asp-action
<form id="selectLanguage" asp-controller="Base" asp-action="SetLanguage" asp-route-returnUrl="@returnUrl" method="post" class="form-horizontal" role="form">
<ul class="list-inline">
@foreach (var culture in cultureItems)
{
var countryIcon = "usa.png";
<li>
<button type="submit" class="btn btn-sm btn-link" name="culture" title="@culture.Text" value="@culture.Value">
@switch (culture.Text)
{
case "Japanese" :
countryIcon = "japan.png";
break;
case "Spanish" :
countryIcon = "spain.png";
break;
default:
break;
}
<img src="@Configuration["BlobStorage:StorageUrl"]/images/@countryIcon" alt="@culture.Text"/>
</button>
</li>
}
</ul>
</form>
BaseController.cs
[Route("[controller]/[action]")]
public class BaseController : Controller
{
[HttpGet]
public IActionResult GetCartViewComponent()
{
return ViewComponent("Cart");
}
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1)}
);
return LocalRedirect(returnUrl);
}
}