代码之家  ›  专栏  ›  技术社区  ›  Steven B.

布局中的窗体:Razor页

  •  1
  • Steven B.  · 技术社区  · 7 年前

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

    <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>
    

    我知道我可以打个基础 PageModel 并从每一页上继承以响应 OnPost 例如

    public abstract class BaseSecurePageModel : PageModel
    {
        [BindProperty]
        public string Customer { get; set; }
        public virtual void OnPostCustomerChange()
        {
            HttpContext.Session.SetString("Customer", Customer);
        }
    }
    

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Andrew    7 年前

    尝试改用控制器,并让您的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+
    

    此setlanguagepartial.cshtml中的HTML包含一个具有相应的ASP控制器和ASP操作的表单

     <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>
    

    基极控制器.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);
                }
            }