Как создать функцию для проверки выпадающего списка в бэкэнде - PullRequest
2 голосов
/ 08 октября 2019

Я разрабатываю небольшую форму с помощью C # и ASP.NET MVC , и в этой форме у меня есть dropdownlist, который показывает некоторые включенные состояния, это зависит отзначение, которое приходит в форме, которая в этом случае будет FINISHED .

Я хотел бы наложить некоторое ограничение со стороны сервера, чтобы избежать того, что если пользователь изменит значения disabled с консоли навигатора, он не позволит ему их отправлять, чтоМне действительно нужно проверить в контроллере, что эти данные не отправляются.

Ниже приведен код dropdownlist с различными параметрами

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

<select id="ticketStatusInput" name="status" class="form-control form-control-user" style="width: 100%; padding: 0.375rem 0.75rem; height: 50px;" tabindex="-1" aria-hidden="true">
<option value="" disabled="" selected="">Select a option</option>
<option value="ABT" disabled="">OPEN</option>
<option value="ASG">ASSIGNED</option>
<option value="CDO" disabled="">CLOSED</option>
<option value="ESU" disabled="">WAITING FOR USER</option>
<option value="PRC">IN PROCESS</option>
<option value="TMN">FINISHED</option>
</select>

Идентификаторы состояний ABT соответствуют состоянию OPEN , ASG соответствует состоянию ASSIGNED , CDO соответствуетсостояние CLOSED , ESU, соответствует состоянию ПОЛЬЗОВАТЕЛЬСКОЕ ОЖИДАНИЕ , PRC соответствует состоянию IN PROCESS , и, наконец, TMN соответствует FINISHED state.

Это функция Javascript, которая загружает данные и выполняет соответствующую проверку. Ясно, что TMN соответствует состоянию FINISHED.

function loadTicketDetails() {
    $(".fixed-action-btn").floatingActionButton();
    $(".fixed-action-btn").show("slow");
    $('[data-toggle="tooltip"]').tooltip();
    document.getElementById("modalAceptNew").style.display = "none";

    const url = document.getElementById("allTicketData").value;

    window.hasRun = true;

    $.ajax({
        url: url,
        type: "POST",
        dataType: "json",
        success: function (data) {

            $("#StatusDiv select").val(data.Status);

            //Validation when FINISHED can be assigned to ASSIGNED/IN PROCESS
            if (data.Status == 'TMN') {

                $("#StatusDiv select option[value*='ABT']").prop("disabled", true);
                $("#StatusDiv select option[value*='CDO']").prop("disabled", true);
                $("#StatusDiv select option[value*='ESU']").prop("disabled", true);
            } 

        },
        error: function() {
            alert("There was an error loading the data, please try again.");
        }
    });

}

И, наконец, контроллер, который должен выполнять некоторую проверку в обратном направлении.

[HttpPost]
public JsonResult UpdateTicketFromDetails()
        {
            var ticketStatusInput = Request.Form["ticketStatusInput"];
        try
            {
                TicketRegisterResult result;               
                using (var scope = new TransactionScope())
                {
                    // I create a new record variable with all fields
                    var record = new TK_DT_RECORDS
                    {
                        TK_CT_STATUS_ID = ticketStatusInput,
                    };
                    // We update the ticket data (this will always be done)
                    var model = new TicketRegisterModel();
                    // We create the new record in the record table and insert it
                    result = model.UpdateTicket;

                    //If the ticket was not saved, the transaction is finished and we return the error message
                    if (!result.Success)
                        return Json(new TicketResult
                        {
                            IsValid = false,
                            Error = "The changes could not be saved, please try again."
                        });
                    scope.Complete();
                }   
            }catch (DbEntityValidationException ex)
        {
            //Failed to try to register data in the database
            foreach (var e in ex.EntityValidationErrors)
            foreach (var validationError in e.ValidationErrors)
                Console.WriteLine("Property: " + validationError.PropertyName + " Error: " +
                                  validationError.ErrorMessage);

            return Json(new TicketResult
            {
                IsValid = false,
                Error = "There was an error creating the ticket, please try again."
            });
        }
            return Json(new TicketResult
            {
                IsValid = true
            });
            }

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

Я нашел статью, в которой говорится о проверке данных на стороне контроллера, но она мне не очень понятна, как только я начну с C #

Артикул

Бизнес-правило

У меня есть раскрывающийся список, где значения ОТКРЫТО , НАЗНАЧЕНО , ЗАКРЫТО , ЖДЕТ ПОЛЬЗОВАТЕЛЯ , В ПРОЦЕССЕ , ЗАВЕРШЕНО .

Когда в раскрывающемся списке появляется значение FINISHED , его можно назначить только для ASSIGNED или IN PROCESS означает, что остальные отключены.

ОБНОВЛЕНИЕ:

У меня проблема с асинхронной функцией <InputStatus>

enter image description here

Ответы [ 4 ]

1 голос
/ 11 октября 2019

Вы также можете использовать этот метод.

Если вам нужна дополнительная проверка, вы можете также создать проверку Custome.

Вы можете отключить эту опцию в базе данных, а затем проверить, хотите ли выдля предотвращения статического сжатия данных.

[HttpPost]
public JsonResult UpdateTicketFromDetails()
{
    var ticketStatusInput = Request.Form["ticketStatusInput"];

    var ticketStatusInput = Request.Form["ticketStatusInput"];
    var oExcludeItem = new string[] { "ABT", "CDO", "ESU" }; // You can use string array also   
    if (!string.IsNullOrEmpty(ticketStatusInput))
    {
        if (oExcludeItem.Contains(ticketStatusInput))
        {
            return Json(new TicketResult
            {
                IsValid = false,
                Error = "Please select only enable option";
             });
        }
    }
    else
    {
        return Json(new TicketResult
        {
            IsValid = false,
            Error = "Please select valid data";
       });
    }
    var lstDisableOption = new List<string>(); // You can also use with List object
    lstDisableOption.Add("ABT");
            lstDisableOption.Add("CDO");
            lstDisableOption.Add("ESU");
            if (!string.IsNullOrEmpty(ticketStatusInput))
            {
                if (lstDisableOption.Any(x => x == ticketStatusInput))
                {
                    return Json(new TicketResult
                    {
                        IsValid = false,
                        Error = "Please select only enable option";
                    });
                 }
            }
            else
            {
                return Json(new TicketResult
                {
                    IsValid = false,
                    Error = "Please select valid data";
                 });
             }
        }

    try
    {
        TicketRegisterResult result;
        using (var scope = new TransactionScope())
        {
            // I create a new record variable with all fields
            var record = new TK_DT_RECORDS
            {
                TK_CT_STATUS_ID = ticketStatusInput,
            };
            // We update the ticket data (this will always be done)
            var model = new TicketRegisterModel();
            // We create the new record in the record table and insert it
            result = model.UpdateTicket;

            //If the ticket was not saved, the transaction is finished and we return the error message
            if (!result.Success)
                return Json(new TicketResult
                {
                    IsValid = false,
                    Error = "The changes could not be saved, please try again."
                });
            scope.Complete();
        }
    }
    catch (DbEntityValidationException ex)
    {
        //Failed to try to register data in the database
        foreach (var e in ex.EntityValidationErrors)
            foreach (var validationError in e.ValidationErrors)
                Console.WriteLine("Property: " + validationError.PropertyName + " Error: " +
                                  validationError.ErrorMessage);

        return Json(new TicketResult
        {
            IsValid = false,
            Error = "There was an error creating the ticket, please try again."
        });
    }
    return Json(new TicketResult
    {
        IsValid = true
    });
}
0 голосов
/ 15 октября 2019

Если я правильно понял ваш вопрос, это может помочь. Это просто подтверждение концепции.

Создание объектной модели StatusTypes

public class StatusTypes{
public string Key { get; set; }
public string Value { get; set; }
}

Объявление переменных внутри класса

public List<StatusTypes> AllowedStatusTypes { get; set; }
public List<StatusTypes> AllStatusTypes { get; set; } = GetAllStatusTypes();

Вот заполнитель функции для получения всехтипы состояний

public static List<StatusTypes> GetAllStatusTypes()
{
var list = new List<StatusTypes>();
// list = call method/url here to get all types
return list;
}

Вызовите этот метод одновременно с загрузкой опций из базы данных для «данных»

public void UpdateAllowedTicketStatusTypes(string statusID)
{
switch(statusID){
    case "TMN":
        AllowedStatusTypes = AllStatusTypes.Where(o => o.Value == "ASG" || o.Value == "PRC").ToList();
        break;
    default:
        AllowedStatusTypes = AllStatusTypes;
        break;
}    
}

Затем внутри вашего UpdateTicketMethod вы можете сделать эту проверку

if(ticketStatusInput == "TMN" && (AllowedStatusTypes.Exists(o => o.Value == "ABT") || AllowedStatusTypes.Exists(o => o.Value == "CDO") || AllowedStatusTypes.Exists(o => o.Value == "ESU"))){
return Json(new TicketResult{
    IsValid = false,
    Error = "Please select valid value."
});
}
0 голосов
/ 15 октября 2019

Ваш вопрос: когда вы загружаете форму с данными (готовое состояние), ваш выпадающий список должен быть доступен только для выбора назначенного или в процессе.

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

Это не полный код, а решение.

var ticketStatusInput = Request.Form["ticketStatusInput"]; 
var idOfOriginalData = Request.Form["id"]; 

//// get the correct or original data. here i uesd get back from database, you can use sessions, viewdata, tempdata 
var originalObj = GetOriginalFromDatabase(idOfOriginalData);

//// then only you can do the validation. 
if ( originalObj.State == "TMN")
{
    var expetedOptions = new string[] { "ASG", "PRC"};

    //// check status that user sent is in expetedOptions
    if ( !expetedOptions.Contains(ticketStatusInput))
    {
        return Json(new TicketResult
        {
            IsValid = false,
            Error = "Please select only enable option";
         });
    }
}
0 голосов
/ 11 октября 2019

Возможно, это не то оптимальное решение, но вы можете сделать тот же запрос, что и при вызове ajax в вашем контроллере через HttpClient. Разобрать данные ответов и сравнить с данными, поступающими из пользовательского интерфейса. Если выбор из пользовательского интерфейса не соответствует правилам - выведите ошибку.

Вот фрагмент кода, который может показать идею:

// Define InputStatus enum, which represents all available statuses

public async Task<InputStatus> GetValidInputStatus(string url)
{
    var httpClient = new HttpClient(); // or better inject it into controller
    var httpReq = new HttpRequestMessage();

    httpReq.Method = HttpMethod.Post;
    httpReq.RequestUri = new Uri(url);

    var response = await httpClient.SendAsync(httpReq);
    var content = await response.Content.ReadAsStringAsync();

    // Parse content string somehow into an InputStatus
    InputStatus validStatus = ParseStatus(content);

    return validStatus;
}

[HttpPost]
public Task<JsonResult> UpdateTicketFromDetails()
{
    var ticketStatusInput = Request.Form["ticketStatusInput"]; // Convert it to InputStatus model somehow
    var validStatus = await GetValidInputStatus(url); // Put here the same url as in your ajax call on the UI

    if (validStatus == InputStatus.TMN && 
        (ticketStatusInput == InputStatus.ABT || ticketStatusInput == InputStatus.CDO || ticketStatusInput == InputStatus.ESU))
    // throw, user sent disabled statuses
    else
    // continue
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...