Как я могу передавать параметры в действие через форму, не отображая ее во внешнем интерфейсе

#asp.net-core #.net-core

#asp.net-core #.net-ядро

Вопрос:

Вот модель:

 public class UserModel()
{
   public string UserName{get;set;}
   public string UserPassword{get;set;}
   public string UserSource{get;set;}
}
  

Вот интерфейс:

 @model Sample.Models.UserModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

    <form asp-controller="Login" asp-action="LoginIn.html" method="post">
                <div>
                    <h3>Name</h3>
                    <span asp-validation-for="UserName"></span>
                </div>
                <input asp-for="UserName" placeholder="Your username" />
                <div>
                    <h3>Password</h3>
                    <span asp-validation-for="UserPassword"></span>
                </div>
                <input asp-for="UserPassword" placeholder="Your password" type="tel" />
                <button type="submit">Login in</button>
            </form>    
  

Внешний интерфейс — это частичное представление. На него ссылаются следующим образом:

 @await Html.PartialAsync("/Views/Contact/LoginIn.cshtml", new Sample.Models.UserModel() { UserSource = "From website" })
  

И вот контроллер:

 [HttpPost]
        [ValidateAntiForgeryToken]
        [Route("LoginIn.html")]
        public IActionResult LoginIn(Sample.Models.UserModel)
        {
            if (ModelState.IsValid)
            {

            }
            return Redirect();
        }
  

Ну, когда форма отправлена, контроллер может получить только UserName / UserPassword , но не может получить UserSource , если я не добавлю

 <input asp-for="UserSource" />
  

во внешний интерфейс.

Я не хочу показывать UserSource пользователю во внешнем интерфейсе (даже скрывать его с помощью CSS).

Как я могу решить эту проблему? Спасибо.

Комментарии:

1. Поскольку вы используете формы, вам придется использовать hidden атрибут в input теге. В противном случае, если вы хотите передать его в HTTP-запросе другим способом (например, заголовками), но вам придется предоставить дополнительную информацию в вашем вопросе.

2. @Svek Способ, который вы указали, похож на скрытие его с помощью CSS (его все еще можно найти в исходном коде интерфейса). Как вы сказали, кажется, я не могу достичь этого с помощью формы, но заголовок может, верно?

3. Независимо от того, какой путь вы выберете, вам, вероятно, потребуется отправить его в сообщении HTTP-запроса. Это означает, что вы можете передать его в других областях (т. Е. Не В теле) запроса (например, в строке запроса, пути, заголовке и т. Д.). Может потребоваться немного больше накладных расходов, чтобы сделать что-то в теле, но это тоже возможно.

4. @Svek Хорошо, большое вам спасибо.

Ответ №1:

Вы можете использовать ajax для отправки формы, вот демонстрация:

TestFormAction:

 public IActionResult TestForm() {
            UserModel u= new UserModel { UserSource = "111" };
            return View(u);
        }
  

LoginController:

 public IActionResult Index()

    {
        return View();
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    [Route("Login/LoginIn.html")]
    public IActionResult LoginIn(UserModel u)
    {
        if (ModelState.IsValid)
        {

        }
        return Ok();
    }
  

TestForm.cshtml:

 <form id="myForm" method="post">
    <div>
        <h3>Name</h3>
        <span asp-validation-for="UserName"></span>
    </div>
    <input asp-for="UserName" placeholder="Your username" />
    <div>
        <h3>Password</h3>
        <span asp-validation-for="UserPassword"></span>
    </div>
    <input asp-for="UserPassword" placeholder="Your password" type="tel" />
    <button type="submit">Login in</button>
</form>
@section scripts{ 
    <script>
        $('#myForm').submit(function (event) {
            event.preventDefault();    // avoid to execute actual form submit.
            var model = {};
            model.UserName = $("#UserName").val();
            model.UserPassword = $("#UserPassword").val();
            model.UserSource =@Model.UserSource;
            var token = $('input[name="__RequestVerificationToken"]').val();
            $.ajax({
                url: '@Url.Action("LoginIn.html", "Login")',
                type: 'POST',
                data: model,
                headers: { "RequestVerificationToken": token },
                success: function (data) {
                    window.location.href = "/Login/Index";
                }
            });

        });
    </script>

}
  

Результат:
введите описание изображения здесь