ASP. Net Core MVC - Запускать скрипт / функцию на стороне клиента после успешной отправки данных формы - PullRequest
0 голосов
/ 14 июля 2020

У меня есть этот код, который генерирует форму.

    <form asp-controller="home" asp-action="EditClient" method="post" class="mt-3" id="EditClientForm">
                <div class="form-group row">
                    <label asp-for="Client.Client" class="col-sm-3 col-form-label"></label>
                    <div class="col-sm-8">
                        <input asp-for="Client.Client" class="form-control" placeholder="Client Name" id="editClient">
                    </div>
                </div>
                <div class="form-group row">
                    <label asp-for="Client.ClientCode" class="col-sm-3 col-form-label">Client Code</label>
                    <div class="col-sm-8">
                        <input asp-for="Client.ClientCode" class="form-control" placeholder="Client Code" id="editClientCode">
                    </div>
                    @*<div class="col-sm-4">
                            <div class="custom-checkbox" style="padding: 0.375rem 0.1rem;">
                                <label asp-for="ClientActive">
                                    <input asp-for="ClientActive" /> Active
                                </label>
                            </div>
                        </div>*@
                </div>
                <button type="submit" class="btn btn-primary">Save</button>
            </form>

и это код в контроллере

[HttpPost]
    public async Task<IActionResult> EditClient(SetupViewModel newModel)
    {
            Employee employee = await employeeRepository.GetEmployeeByPhoneNumber(((ClaimsIdentity)User.Identity).FindFirst(AccountConstant.PhoneNumber).Value);
            var model = HttpContext.Session.GetComplexData<SetupViewModel>("SetupModel");
            foreach (var project in model.Projects)
            {
                project.ClientCode = newModel.Client.ClientCode;
                project.Client = newModel.Client.Client;
                await projectRepository.Update(project, employee);
            }
            model.Client.Client = newModel.Client.Client;
            model.Client.ClientCode = newModel.Client.ClientCode;

            HttpContext.Session.SetComplexData("SetupModel", model);
            return RedirectToAction("Setup", "Home");

    }

После успешной отправки процесса, я хочу показать успешное модальное окно. Как это сделать ? У меня есть поиск, чтобы использовать Ajax, но я не совсем понимаю.

1 Ответ

0 голосов
/ 14 июля 2020

Это можно сделать несколькими способами. Для небольшого проекта, который я работаю над простым механизмом, будет достаточно, и я использую TempData. У меня есть метод расширения stati c для класса контроллера. Я просто добавляю сообщение и отображаю в действии, которое затем отображается в макете, используемом всеми представлениями

/// <summary>
/// Add a message to a list of messages in Tempdata
/// </summary>
/// <param name="c"></param>
/// <param name="message"></param>
public static void AddTempDataMessage(this Controller c, string message)
{
    // assume a new list
    var messages = new List<string>();

    // check if object already exists
    object m = c.TempData.Peek("Messages");

    // object stored as a string array for simplicity
    if (m != null && m is string[] v)
    {
        // set existing array to the list
        messages = v.ToList();
    }

    messages.Add(message);

    // Store as a simple array since using a List<string> changes to string[] on redirect (Microsoft bug?)
    c.TempData["Messages"] = messages.ToArray();
}

Пример использования действия

    if (imageExists != null)
    {
        this.AddTempDataMessage("Image already in set");
        return RedirectToAction("EditImageSet", new { imageSetId });
    }

Использование в общем представлении макета

// A list of messages to display
List<string> Messages()
{
    // assume a new list
    var messages = new List<string>();

    // check if already exists
    object m = TempData["Messages"];

    // stored as an array of strings since a redirect changes a list to an array so we stored it as an array
    if (m != null && m is string[])
    {
        // set existing
        messages = ((string[])m).ToList();
    }

    return messages;
}



        @* Messages *@
        <div class="text-danger">
            @foreach (var m in Messages())
            {
                <span class="mr-2">@(m + ".")</span>
            }
        </div>
...