Добавление префикса к свойствам, определенным в AdditionalFields
, является заданным и добавляется jquery.validate.unobtrusive.js
. Соответствующий код добавляет префикс в методе adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
.
Есть множество вариантов решения вашей проблемы
Создайте свой собственный (скажем) [ValidateAntiForgeryTokenWithPrefix]
атрибут на основе существующего исходного кода, но измените, чтобы убрать любой префикс из запроса (не рекомендуется)
Сделайте свой собственный вызов ajax вместо использования атрибута [Remote]
- то есть обработайте событие .blur()
текстового поля для вызова метода сервера, передавая значение и токен, и обновите заполнитель, сгенерированный @Html.ValidationMessageFor()
в обратном вызове успеха и обработайте событие .keyup()
, чтобы очистить любое сообщение. Это имеет преимущество в производительности, потому что после начальной проверки правило remote
делает ajax-вызов для каждого события keyup()
, поэтому может привести к большому количеству вызовов сервера и базы данных.
Однако самым простым решением было бы создать 3 партиала на основе LoginViewModel
, SignUpViewModel
и ForgetPasswordViewModel
и затем вызывать из основного представления, используя @Html.Partial()
, например
_SignUpViewModel.cshtml
@model SignUpViewModel
....
@using (Html.BeginForm(MVC.Account.ActionNames.Register, MVC.Account.Name, FormMethod.Post, new { id = "RegisterForm", @class = "m-login__form m-form", role = "form" }))
{
@Html.AntiForgeryToken()
....
<div class="form-group">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control", placeholder = "Email *", autocomplete = "off" })
<span class="helper">
@Html.ValidationMessageFor(model => model.UserName)
</span>
</div>
....
}
и на главном экране
@model LoginIndexViewModel
....
@Html.Partial("_SignUpViewModel", Model.SignUp)
.... // ditto for Login and ForgetPassword properties
Затем можно опустить [Bind(Prefix = "SignUp.UserName")]
в методе CheckUsername()
.
В качестве альтернативы вы создаете основной вид на основе, скажем, LoginViewModel
, а затем используете @Html.Action()
для вызова [ChildActionOnly]
методов, которые возвращают частичные представления других 2 форм.
Сказав это, пользователь будет когда-либо использовать форму SignUp
только один раз и никогда не сможет использовать форму ForgetPassword
, поэтому включение всего этого дополнительного html просто снижает производительность, и было бы лучше иметь ссылки на перенаправьте их на отдельные страницы для SignUp
и ForgetPassword
, или, если вы хотите, чтобы они были на одной странице, загрузите партиалы для них по требованию, используя ajax.
В качестве примечания вам не нужен аргумент JsonRequestBehavior.AllowGet
в вашем return Json(...)
(это метод [HttpPost]
), и вы никогда не должны устанавливать атрибут value
при использовании методов HtmlHelper
.