C# 布局中的表单:Razor页面

C# 布局中的表单:Razor页面,c#,asp.net-core-2.0,razor-pages,C#,Asp.net Core 2.0,Razor Pages,在我的web应用的布局中,我有一个select的表单,需要从每个页面访问它。表单设置了在每个页面上加载数据所需的会话变量 <form asp-page-handler="CustomerChange" method="post" class="navbar-form navbar-left"> <select name="Customer" id="Customer" class="form-control" onchange="this.form.submit()"&

在我的web应用的布局中,我有一个
select
表单
,需要从每个页面访问它。表单设置了在每个页面上加载数据所需的会话变量

<form asp-page-handler="CustomerChange" method="post" class="navbar-form navbar-left">
    <select name="Customer" id="Customer" class="form-control" onchange="this.form.submit()">
        <option value="">Select Customer</option>
        <option value="Vand">Vandalay</option>
        <option value="Kram">Kramerica</option>
    </select>
</form>

但这不利于将模型绑定到表单,还要求我记住在每个页面中从基类继承。是否有正确的方法来处理需要在任何地方都可用的表单?

尝试改用控制器,并让CustomerChange ActionResult指定一个[Route()]。我使用一个控制器为我的大多数布局项目,如购物车,本地化等。。。在剃须刀页面和工作相当好

//根据Steven B.的反馈更新了答案

下面是我上面提到的本地化示例。该表单触发对BaseController.cs中的SetLanguage方法的post

在_Layout.cshtml文件中,在本例中,我有一个局部视图:

@Html.Partial("_SetLanguagePartial") // Used prior to .net core 2.1

<partial name="_SetLanguagePartial" /> // Used for .net core 2.1+

您应该使用一个ViewComponent,如下面的回答所述:这就是我最终要做的。如果您将示例表单和ViewComponent添加到您的答案中,以便下一个人拥有完整的代码,我将接受此作为答案。
@Html.Partial("_SetLanguagePartial") // Used prior to .net core 2.1

<partial name="_SetLanguagePartial" /> // Used for .net core 2.1+
 <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>
[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);
            }
        }