Форма в макете: бритвенные страницы - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть select в form в макете моего веб-приложения, который должен быть доступен с каждой страницы.Форма устанавливает переменную сеанса, которая требуется для загрузки данных на каждой странице.

<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 Ответ

0 голосов
/ 12 февраля 2019

Попробуйте использовать контроллер вместо этого, и пусть ваш 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);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...