SLaks ответ правильный, но отсутствует некоторая дополнительная информация.
Если вы хотите использовать традиционную (не ненавязчивую) проверку на стороне клиента, вам нужно предоставить formContext и дать ему идентификатор, чтобыпроверка на стороне клиента может работать.В его объяснении эта часть отсутствует.
Самый простой способ достичь этого - использовать экземпляр класса MvcForm
, который создает formContext
и реализует интерфейс IDisposable
.
В этой реализации мне нужно было указать идентификатор формы:
public static MvcForm BeginFormDatosAdicionales(this HtmlHelper htmlHelper,
string id, ..., IDictionary<string, object> htmlAttributes = null)
{
TagBuilder form = new TagBuilder("form");
// attributes
form.MergeAttributes(htmlAttributes);
// action
string formAction = ...;
form.MergeAttribute("action", formAction);
// method
FormMethod method = ...;
form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
// id
form.MergeAttribute("id", id);
// writes the form's opening tag in the ViewContext.Writer
htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag));
// creates an MvcForm (disposable), which creates a FormContext, needed for
// client-side validation. You need to supply and id for it
MvcForm theForm = new MvcForm(htmlHelper.ViewContext);
htmlHelper.ViewContext.FormContext.FormId = form.Attributes["id"];
// The returned object implements IDisposable, and writes the closing form tag
return theForm;
}
Конечно, это можно настроить для вашего конкретного случая.Если вы хотите предоставить идентификатор для своей формы только в случае крайней необходимости, проверьте это условие:
bool idRequired = htmlHelper.ViewContext.ClientValidationEnabled
&& !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;
В этом случае вы должны быть осторожны при создании разных идентификаторов для каждой формы на странице.Например, вы можете добавить целочисленный суффикс, который можно сохранить в HttpContext.Items и увеличивать при каждом создании нового идентификатора.Это гарантирует, что на одной странице все сгенерированные идентификаторы будут разными.
HttpContext.Current.Items["lastFormId"]