Razor Page Частичная визуализация ввода и скрытого ввода - PullRequest
0 голосов
/ 10 ноября 2019

Я испытываю очень странное поведение с ASP .net core 2.2 Razor Pages.

Допустим, у меня есть стандартная страница Razor. Пользователь может отправить запрос через эту страницу для новой команды, которая должна быть подготовлена. У меня есть несколько полей, таких как DisplayName и т. Д., Которые пользователь может свободно редактировать, и выпадающий список, из которого он может выбрать, из какой существующей команды он хотел бы клонировать некоторые настройки. После того как пользователь выбрал его, я использую Ajax для рендеринга частичного представления в правой части представления, и пользователь также может выбрать некоторые дополнительные параметры. Пока здесь я в порядке, и все работает до сих пор. Я ожидал, что если пользователь нажмет кнопку «Сохранить / отправить», в запрос будет добавлено все, даже частичное представление данных. После осмотра и устранения неполадок я обнаружил, что должен установить ViewData.TemplateInfo.HtmlFieldPrefix , чтобы назвать все как в родительском представлении, чтобы не испортить связывание. Работает также.

Странное поведение состоит в том, что после рендеринга частичного представления в HTML были сгенерированы два поля Inputs. Тот, где пользователь может выбрать, и тот, который скрыт. Я покажу свой код, а также отрендеренный HTML-файл, чтобы ребята могли сами себе это представить. Теперь происходит следующее: скрытые поля имеют значения по умолчанию или значения NULL, и они будут включены в запрос. Я понятия не имею, откуда они берутся и / или как это исправить, или что я сделал не так?

Я немного укоротю свой код, но буду включать необходимые части.

Модель запроса команды

public class TeamRequestModel
    {
        public string DisplayName { get; set; }
        public string Description { get; set; }
        public string Visibility { get; set; }
        public List<string> Owners { get; set; }
        public string CloneTeamID { get; set; }
        public TeamCloneSettings TeamCloneSettings { get; set; }

        public TeamRequestModel()
        {
            TeamCloneSettings = new TeamCloneSettings();
        }
    }

Настройки клонирования команды (только детали могут быть установлены пользователем

    public class TeamCloneSettings
    {
        [JsonProperty(PropertyName = "id")]
        public string Id { get; set; }
        public string PartitionKey;
        public string DisplayName { get; set; }
        public bool Released { get; set; }
        public bool FixedVisibility { get; set; }
        public string Visibility { get; set; }
        public bool CloneEverything { get; set; }
        public TeamCloneParts Parts { get; set; }

        public TeamCloneSettings()
        {
            Parts = new TeamCloneParts();
        }
    }

    public class TeamCloneParts
    {
        public bool CloneApps { get; set; }
        public bool CloneChannels { get; set; }
        public bool CloneTabs { get; set; }
        public bool CloneSettings { get; set; }
    }
}

Main "Team"Представление запроса "

@page
@model iwDashboard.Pages.Teams.TeamRequest
@{
    ViewData["Title"] = Model.Title;
}

@{
    ViewBag.PageTitle = Model.Title;
}

<style>
    textarea {
        resize: none;
    }
</style>

<section class="content">
    <form method="post" asp-page-handler="SaveTeamRequest" class="col-md-12">
        <div class="row">
            <div class="col-md-3">
                <div class="card card-primary">
                    <div class="card-header">
                        <h3 class="card-title">Team Details</h3>
                    </div>
                    <div class="card-body">
                        <div class="form-group">
                            <label for="displayName">Display Name</label>
                            <input id="displayName" asp-for="@Model.teamRequest.DisplayName" type="text" class="form-control" required />
                        </div>
                        ... More fields
                        <div style="float: left; width: 40%">
                            <button type="button" onclick="history.go(-1)" data-toggle="tooltip" title="Back" class="btn btn-primary btn-block btn-sm"><i class="fa fa-arrow-circle-left"></i><b>  Back</b></button>
                        </div>
                        <div style="float: right; width: 40%">
                            <button type="submit" data-toggle="tooltip" title="Save" class="btn btn-success btn-block btn-sm"><i class="fas fa-save"></i><b>  Save</b></button>
                        </div>
                    </div>
                    <!-- /.card-body -->
                </div>
                <!-- /.card -->
            </div>
            <div class="col-md-6">
                <div class="card card-secondary">
                    <div class="card-header">
                        <h3 class="card-title">Team Settings</h3>
                    </div>
                    <div class="card-body">
                        <!--partial comes here-->
                        <div id="partialDiv"></div>
                    </div>
                    <!-- /.card-body -->
                </div>
                <!-- /.card -->
            </div>
        </div>
    </form>
</section>

@section Scripts
{
    <script>
        function GetTeamTemplateProperties() {
            var selectedTeam = $('#teamTemplateSelection').val();
            $.ajax({
                type: "Get",
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("XSRF-TOKEN",
                        $('input:hidden[name="__RequestVerificationToken"]').val());
                },
                url: '/Teams/TeamRequest?handler=TeamTemplateProperties',
                data: {
                    SelectedTeam: selectedTeam
                },
                success: function (result) {
                    $("#partialDiv").after(result);
                }
            })
        };
    </script>
}

Получить сообщение свойств шаблона, вызванное Ajax

public async Task<IActionResult> OnGetTeamTemplateProperties(string SelectedTeam)
        {
            TeamCloneSettings teamCloneSettings = new TeamCloneSettings();
            teamRequest = new TeamRequestModel();
            if (!string.IsNullOrEmpty(SelectedTeam))
            {
                teamCloneSettings = await _teamCloneSettingService.GetTeamCloneSettingByIdAsync(SelectedTeam);
                teamRequest.TeamCloneSettings = teamCloneSettings;
            }

            ViewData.TemplateInfo.HtmlFieldPrefix = "teamRequest";
            SelectedValue = SelectedTeam;
            return new PartialViewResult
            {
                ViewName = "_TeamCloneSettingsPartial",
                ViewData = new ViewDataDictionary<TeamRequestModel>(ViewData, teamRequest)
            };
        }

Просмотр модели BindProperty

...More Code

[BindProperty]
public TeamRequestModel teamRequest { get; set; }
[BindProperty]
public string SelectedValue { get; set; }

...More Code

_TeamCloneSettingsPartial

@model iwDashboard.Models.TeamRequestModel

@{
    <!--
        Check if fixed visibility is enabled and
        disable selection of visibility if it is
    -->
    string disabled = null;
    string options = null;
    if (Model.TeamCloneSettings.FixedVisibility)
    {
        disabled = "disabled";
        options = Model.Visibility;
    }
}
<div class="form-group">
    <input type="checkbox" hidden id="cloneEverthing" checked=@Model.TeamCloneSettings.CloneEverything>
    <ul class="list-group list-group-unbordered mb-3">
        <li class="list-group-item">
            <label for="visibility">Visibility</label>
            <select class="form-control @disabled custom-select" asp-for="TeamCloneSettings.Visibility" required>
                @if (!string.IsNullOrEmpty(disabled))
                {
                    <option readonly selected>@Model.TeamCloneSettings.Visibility</option>
                }
                else
                {
                    <option>Public</option>
                    <option>Private</option>
                }
            </select>
        </li>
        <!-- Checkbox parts here
            Javascript will check if "CloneEverything"
            is enabled and will disable all of the following checkboxes
        -->
        <li class="list-group-item">
            <div class="form-group">
                <div class="custom-control custom-switch">
                    <input type="checkbox" class="custom-control-input" id="cloneApps" checked=@Model.TeamCloneSettings.Parts.CloneApps asp-for="TeamCloneSettings.Parts.CloneApps">
                    <label class="custom-control-label" for="cloneApps">Clone Apps</label>
                </div>
            </div>
        </li>
        <li class="list-group-item">
            <div class="form-group">
                <div class="custom-control custom-switch">
                    <input type="checkbox" class="custom-control-input" id="cloneChannels" checked=@Model.TeamCloneSettings.Parts.CloneChannels asp-for="TeamCloneSettings.Parts.CloneChannels">
                    <label class="custom-control-label" for="cloneChannels">Clone Channels</label>
                </div>
            </div>
        </li>
        <li class="list-group-item">
            <div class="form-group">
                <div class="custom-control custom-switch">
                    <input type="checkbox" class="custom-control-input" id="cloneSettings" checked=@Model.TeamCloneSettings.Parts.CloneSettings asp-for="TeamCloneSettings.Parts.CloneSettings">
                    <label class="custom-control-label" for="cloneSettings">Clone Settings</label>
                </div>
            </div>
        </li>
        <li class="list-group-item">
            <div class="form-group">
                <div class="custom-control custom-switch">
                    <input type="checkbox" class="custom-control-input" id="cloneTabs" checked=@Model.TeamCloneSettings.Parts.CloneTabs asp-for="TeamCloneSettings.Parts.CloneTabs">
                    <label class="custom-control-label" for="cloneTabs">Clone Tabs</label>
                </div>
            </div>
        </li>
    </ul>
</div>

Странно визуализированное поле ввода

https://i.stack.imgur.com/aZtUD.png

Как видно, ввод отображается дважды, и будут передаваться только скрытые значения. Но это происходит только для полей ввода в частичном представлении, все остальные поля в порядке.

Любые идеи? Было бы здорово :-).

Большое спасибо !!

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Нашел решение здесь:

asp.net mvc: почему Html.CheckBox генерирует дополнительный скрытый ввод

Может быть не лучшим, но это работаетдля меня:

проверка с помощью Javascript, установлен ли флажок, и установка значения скрытого поля:

if ($('[name="foo"]:checked').length > 0)
    $('[name="foo"]:hidden').val(true);

Спасибо всем!

0 голосов
/ 10 ноября 2019

Сгенерировать 2 поля ввода нормально при использовании помощника тега asp-for для флажка. Он создаст сам флажок, но также и скрытое поле ввода для подшивки модели для отправки значения, выбранного пользователем.

Для отправки данных будет использоваться только скрытое поле, созданное помощником тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...