【问题标题】:Asp Validations inside a modal模态中的 Asp 验证
【发布时间】:2021-12-09 10:47:31
【问题描述】:

我正在为 CRUD 操作创建模态弹出窗口。我已经为创建和编辑创建了工作模式。我的问题是现在我无法使用我需要的服务器端的验证。当 Edit 验证测试失败时,它会正确地拒绝请求,但会以非模式形式重定向回 Edit 视图。请看下文。

模态:

输入无效后:

我相信它会从 URL 进入控制器后期编辑和呈现。这很好,因为它可以验证引脚是否正确为空,但是这需要在 Modal Edit 1234 弹出窗口中呈现。将包括模型、控制器、索引视图、编辑视图和 js 来帮助解决问题。感谢您的帮助。

型号:

    public class Airmen
{

    [Key]
    [Required]
    public string MobileID { get; set; }
    [Required]
    public string Pin { get; set; }


}
public class SuperModel
{
    public Airmen airmen { get; set; }
    public IEnumerable<Airmen> airmens { get; set; }
}

控制器:

public async Task<IActionResult> Index(SuperModel arm)
{

    arm.airmens = await _context.Airmen.ToListAsync();
    return View(arm);
}
    [HttpGet]
    public async Task<IActionResult> Edit(string id)
    {
        SuperModel airmen = new SuperModel();
        airmen.airmen = await _context.Airmen.FindAsync(id);
        return PartialView(airmen);
    }


    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(string id, [Bind("MobileID,Pin")] Airmen airmen)
    {
        SuperModel amn = new SuperModel();
        
        if (id != airmen.MobileID)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(airmen);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AirmenExists(airmen.MobileID))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }
        amn.airmen = airmen;
        return PartialView(amn);
    }

索引视图:

    @model ALRSweb4.Models.SuperModel

@{ViewData["Title"] = "Index";}
<h1>Index</h1>
<table class="table">
    <thead>
        <tr>
            <th>
                Mobile ID
            </th>
            <th>
                Pin
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.airmens)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.MobileID)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Pin)
                </td>

                <td>
                    <button type="button" class="btn btn-primary" data-toggle="ajax-modal" data-target="#Edit" data-url="@Url.Action(item.MobileID,"Airmen/Edit")">
                        Edit
                    </button>
                    <a asp-action="Details" asp-route-id="@item.MobileID">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.MobileID">Delete</a>
                </td>
            </tr>
        }

    </tbody>
</table>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#CreateModal">
    Create
</button>

<div class="modal fade" id="CreateModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">Create</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                @Html.Partial("Create")
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>
<div id="EditPlaceHolder">
</div>

编辑视图:

@model ALRSweb4.Models.SuperModel

@{
    ViewData["Title"] = "Edit";
}

<div class="modal fade" id="Edit" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">Edit 12343</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-md-4">
                        <form asp-action="Edit">
                            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                            <input asp-for="airmen.MobileID" />
                            <div class="form-group">
                                <label asp-for="airmen.Pin" class="control-label"></label>
                                <input asp-for="airmen.Pin" class="form-control" />
                                <span asp-validation-for="airmen.Pin" class="text-danger"></span>
                            </div>
                            <div class="form-group">
                                <input type="submit" value="Save" class="btn btn-primary" />

                            </div>
                        </form>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>


@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

JS:

    // t2
$(function () {
    var CreatePlaceHolderElement = $('#EditPlaceHolder');
    $('button[data-toggle="ajax-modal"]').click(function (event) {
        var url = $(this).data('url');
        var decodedUrl = decodeURIComponent(url);
        $.get(decodedUrl).done(function (data) {
            CreatePlaceHolderElement.html(data);
            CreatePlaceHolderElement.find('.modal').modal('show');
        })
    })

    CreatePlaceHolderElement.on('click', '[data-save="modal"]', function (event) {
        var form = $(this).parents('.modal').find('form');
        var actionUrl = form.attr('action');
        var sendData = form.serialize();
        $.post(actionUrl, sendData).done(function (data) {
            CreatePlaceHolderElement.find('.modal').modal('hide');
            location.reload(true);
        })
    })

})
// end of t2
// start of function for create modal
$(function () {
    var CreatePlaceHolderElement = $('#CreatePlaceHolder');
    $('button[data-toggle="ajax-modal"]').click(function(event){
        var url = $(this).data('url');
        $.get(url).done(function (data) {
            CreatePlaceHolderElement.html(data);
            CreatePlaceHolderElement.find('.modal').modal('show');
        })
    })

    CreatePlaceHolderElement.on('click', '[data-save="modal"]', function (event) {
        var form = $(this).parents('.modal').find('form');
        var actionUrl = form.attr('action');
        var sendData = form.serialize();
        $.post(actionUrl, sendData).done(function (data) {
            CreatePlaceHolderElement.find('.modal').modal('hide');
            location.reload(true);
        })
    })

})
// end of function for create modal

【问题讨论】:

  • 您需要将验证放在模态框内。这样,如果用户输入了无效的输入,模态框就不会被提交。如果客户端验证通过,那么您可以在服务器端进行服务器端验证。
  • 没有这样的元素有data-save="modal"。在您的编辑视图中有一个提交按钮,它将在没有 ajax 的情况下形成提交并进入您的编辑操作并返回带有模型的部分视图。

标签: javascript jquery asp.net-mvc asp.net-core


【解决方案1】:

Html.RenderPartialAsync无法通过ajax回调成功渲染js。所以最快的方法是在编辑视图中添加js,如下所示,它会阻止表单提交:

<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

下面的ajax功能没用,只是去掉下面的代码使用默认的表单提交。删除它的原因首先是因为您的代码没有任何带有data-save="modal" 的元素。然后你有&lt;input type="submit" /&gt;,它将默认提交你的表单数据而不使用ajax。

CreatePlaceHolderElement.on('click', '[data-save="modal"]', function (event) {
    var form = $(this).parents('.modal').find('form');
    var actionUrl = form.attr('action');
    var sendData = form.serialize();
    $.post(actionUrl, sendData).done(function (data) {
        CreatePlaceHolderElement.find('.modal').modal('hide');
        location.reload(true);
    })
})

【讨论】:

  • 感谢瑞纳。没有意识到我忘记添加客户端验证脚本。问题,或者我可以将其发布在一个单独的问题上。一旦我遇到服务器端验证。我可以重定向回索引并发布错误消息。是否可以再次打开模式并从编辑按钮列表中的正确编辑模式中显示此错误?
  • 嗨@tachidow,您使用客户端验证,因此除非通过验证,否则您将始终进入操作。所以你的服务器端验证总是正确的。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2020-08-30
  • 2016-11-04
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2014-07-18
相关资源
最近更新 更多