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