MVC Как получить стили проверки для входных элементов, не подключенных к модели просмотра?

На мой взгляд, у меня есть поле поиска, id = searchPrimaryTrade . Это требование, чтобы первичная торговля была найдена и представлена.

Я использую jQuery для копирования идентификатора выбранной сделки в скрытое поле;

@Html.HiddenFor(model => model.PrimaryTradeId)

Если пользователь не вводит основную сделку, отображается сообщение об ошибке.

Однако то, что я также хочу сделать, это запустить те же стили проверки CSS, что и в текстовом поле поиска (id = searchPrimaryTrade) и отобразить маркер * рядом с ним. Другими словами, я хочу, чтобы текстовое поле было выделено красной рамкой.

В приведенном ниже коде это то, что происходит, когда имя_компании не введено. Итак, как мне это сделать?

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    ViewContext.FormContext.ValidationSummaryId = "valSumId";
    @Html.ValidationSummary(false, "Please fix these errors.", new Dictionary { { "id", "valSumId" } });

    
Create Subcontractor

@ViewBag.Message

<table class="formTable"> <tr> <td class="leftCell">@Html.LabelFor(model => model.Subcontractor.CompanyName) </td> <td class="rightCell">@Html.TextBoxFor(model => model.Subcontractor.CompanyName, new { @style = "width: 300px;" }) @Html.ValidationMessageFor(model => model.Subcontractor.CompanyName, "*")</td> </tr> <tr> <td class="leftCell">@Html.LabelFor(model => model.PrimaryTrade)</td> <td class="rightCell"><input type="search" name="searchPrimaryTrade" id="searchPrimaryTrade" data-scd-autocomplete="@Url.Action("AutocompletePrimaryTrade", "DataService")" style = "width: 300px;" data-val="true" data-val-required="Must enter a Primary Trade" class="primaryTrade required"/> <input type="button" id="ResetPrimaryTrade" value="Reset"/>
@Html.HiddenFor(model => model.PrimaryTradeId) @Html.ValidationMessageFor(model => model.PrimaryTradeId, "*") Cannot find the trade? @Html.DialogFormButton("Add New Trade", Url.Action("AddTrade", "Popup"), "Add New Trade", null, Url.Action("Create"), "buttonAddNewTrade") </td> </tr>
2
nl ja de
Мне нужно было бы начать поискPrimaryTrade в модели?
добавлено автор arame3333, источник
просто используйте @ Html.ValidationMessageFor (model => model.searchPrimaryTrade, "*") под текстовым полем searchPrimaryTrade .
добавлено автор Karthik Chintala, источник
Да, и вы можете сделать это как [Обязательно]
добавлено автор Karthik Chintala, источник

1 ответы

Вам действительно не нужно это скрытое поле. Вы можете просто украсить свойство PrimaryTradeId в вашей модели представлений с помощью атрибута [Required] :

[Required]
public int? PrimaryTradeId { get; set; }

а затем используйте Html.TextBoxFor и Html.ValidationMessageFor помощники вместо жесткого кодирования некоторых полей ввода в вашей разметке:

<td class="rightCell">
    @Html.TextBoxFor(
        model => model.PrimaryTradeId,
        new {
            type = "search",
            data_scd_autocomplete = Url.Action("AutocompletePrimaryTrade", "DataService"),
            style = "width: 300px;",
            @class = "primaryTrade required"
        }
    )
    <input type="button" id="ResetPrimaryTrade" value="Reset"/>
@Html.ValidationMessageFor(model => model.PrimaryTradeId, "*") Cannot find the trade? @Html.DialogFormButton( "Add New Trade", Url.Action("AddTrade", "Popup"), "Add New Trade", null, Url.Action("Create"), "buttonAddNewTrade" ) </td>

Теперь помощники Html позаботятся о создании надлежащей разметки и выдаче правильных атрибутов проверки на основе аннотаций данных на вашей модели.

4
добавлено
Проблема в том, что model.PrimaryTradeId означает число, целочисленный идентификатор сделки, и это решение заполнит его текстом. Пользователь, конечно же, хочет видеть текст, но когда форма будет опубликована, тип данных будет неправильным для этого поля.
добавлено автор arame3333, источник
Да, я могу это сделать. Однако требуется, чтобы PrimaryTradeId должен был> 0, который я заполняю из javascript, и доказывает, что была выбрана действительная первичная торговля.
добавлено автор arame3333, источник
Пользователь может ввести текст, который не выбран из автозаполнения. Поэтому для PrimaryTrade требуемый валидатор выполняется, но PrimaryTradeId равен 0 или null, что НЕ является допустимым. Как настроить эту проверку?
добавлено автор arame3333, источник
Затем вы можете оставить скрытое поле и поместить свойство строки PrimaryTrade в свою модель просмотра с помощью атрибута [Обязательный] . Очевидно, помощник ValidationMessageFor будет указывать на видимое свойство PrimaryTrade , для которого у вас есть поле ввода. Затем, используя javascript, вы можете заполнить значение скрытого поля, когда выбор сделан из поля автозаполнения.
добавлено автор Darin Dimitrov, источник
Но это будет так, потому что вы всегда будете устанавливать значение этого скрытого поля с помощью javascript. И если пользователь ничего не выбирает, обязательный валидатор для строкового поля PrimaryTrade запустится и отобразит сообщение об ошибке.
добавлено автор Darin Dimitrov, источник
Если вы подписаны на событие change поля ввода, вы всегда можете установить соответствующее значение скрытого поля.
добавлено автор Darin Dimitrov, источник
У вас также есть возможность выполнить выборочную проверку на сервере: если для поля PrimaryTrade есть значение, но поле PrimaryTradeId пустое, это означает, что вы в этом случае и вы могли бы действовать соответственно.
добавлено автор Darin Dimitrov, источник
Если пользователь непосредственно вводит текст в поле ввода без использования автозаполнения, не будет ничего, чтобы установить значение скрытого поля, которое является ситуацией, которую вы обнаруживаете на своем сервере, и не удалось проверить правильность поля PrimaryTrade ,
добавлено автор Darin Dimitrov, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)