【问题标题】:How can I render a partial view error modal into another view from a MVC controller?如何从 MVC 控制器将部分视图错误模式渲染到另一个视图中?
【发布时间】:2020-03-13 16:06:29
【问题描述】:

如果在调用 SaveDailyCriteria 操作后需要向用户显示问题或错误,我希望显示此错误模式窗口。我需要在进行 SaveDailyCriteria 操作调用的视图中呈现部分视图。使用下面我目前拥有的代码,return PartialView("_ErrorsModal", notification) 被调用但从未显示在我的主视图上。

控制器

[HttpPost]
public ActionResult SaveDailyCriteria(Daily report, string EnteredCriteriaName)
{
    var criteria = report.ConvertToCriteria(report);
    criteria.CriteriaName = EnteredCriteriaName;
    var dr = new ReportDaily();
    var nameExists = dr.DoesCriteriaNameAlreadyExist(criteria);
    if (dr.SaveReportCriteria(criteria, nameExists, out Notification notification) == false)
    {
        return PartialView("_ErrorsModal", notification);
    }
    else {
        return View(report);
    }
}

主视图

@model Company.Areas.Reports.Models.Daily
@using Company.TaxCollection.Reports;
@{
    ViewData["Title"] = "Daily Report";
}

<h1>@ViewData["Title"]</h1>
<br />

@using (Html.BeginForm("DailySubmit", "Reports", FormMethod.Post, new { id = "reportForm", @class = "report-form col-9" }))
{
...
...
<div id="saveModal" class="modal fade" role="dialog">
    <div class="modal-dialog">

        <!-- Modal content-->
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title float-left">Save Criteria</h4>
                <button type="button" class="close" data-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <label>Enter the name to save as:</label><input type="text" id="savedReportName" name="EnteredCriteriaName" class="form-control" />
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-primary" id="saveSubmit" data-dismiss="modal">Save</button>
            </div>
        </div>

    </div>
</div>
}
<script>
$(document).ready(function () {
    var dataType = 'application/x-www-form-urlencoded; charset=utf-8';
    $(function () {
        $('#saveSubmit').on('click', function (evt) {
            var data = $('form').serialize();
            //Ajax form post
            $.ajax({
                type: 'POST',
                data: data,
                contentType: dataType,
                url: '@Url.Action("SaveDailyCriteria", "Reports")',
                success: function (data) {
                    console.log(data);
                    if (data.success) {
                        //window.location.href = data;
                    } else {
                        //window.location.href = data;
                    }
                }
            });
        });
    });
});
</script>

_ErrorsModal 部分视图

@model Company.NotificationPattern.Notification
<!-- Modal -->
<div id="errorsModal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <!-- Modal content-->
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title float-left">Warning</h4>
                <button type="button" class="close" data-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                @if (Model.HasErrors || Model.HasWarnings) {
                    <p>@Model.GetConcatenatedErrorMessage(Environment.NewLine + Environment.NewLine)</p>
                }
            </div>
            <div class="modal-footer">
                <button type="button" id="modalConfirm" class="btn btn-primary" data-dismiss="modal">OK</button>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

    标签: c# jquery ajax asp.net-mvc


    【解决方案1】:

    您可以通过多种方式实现这一目标,一种选择:

    • 在您的控制器 post 方法中,当它通过时返回一个 json,当它失败时返回一个部分。
    • 在您的 jquery $.ajax 后检查 json 并继续,否则将结果呈现给您的模态

    在您的情况下,传递时返回的 json 将指示要重定向到的视图的 url(不是视图本身,否则无法知道它是新视图还是部分错误)。例如

    if (save() == false)
    {
        return PartialView("_ErrorsModal", notification);
    }
    else {
        return Json({ 
            success = true, 
            url = this.Url.Action("SaveDailyCriteria", new { reportId = report.ReportId }
        });
    }
    

    和你的 javascript 到:

    $.ajax({
        type: 'POST',
        ...
        success: function (data) {
            if (data.success) 
                window.location.href = data.url;
            else
                $("#modalId").html(data);
        }
    });
    

    另一种方法是始终返回 json,但将控制器内的 _ErrorsModal(错误时)或 View(成功时)渲染到字符串并将该字符串添加为 json 属性。 IMO 最好让 MVC 管道处理渲染到 HTML,所以推荐上述方法。

    【讨论】:

    • 我添加了您的代码,它似乎几乎可以工作。由于我的代码行console.log(data),我在浏览器开发工具控制台中看到了错误部分视图,但它从未呈现到视图中。你认为这是因为data.success 永远不会返回为假吗?
    • 这一行渲染$("#modalId").html(data); - 您需要用正确的模式选择器替换$("#modalId") - 在您的情况下,这将是:$("#errorsModal").find(".modal-body").html(data)
    • 这不会为同一错误模态的模态体 div 内的错误模态呈现整个部分视图吗?我不是最熟悉 bootstrap 的模态窗口,但我是否还需要在 .html(data) 行之后调用类似 $('#errorsModal').modal('toggle') 的内容以使其显示给用户?
    • 是的,您将模态对话框的modal-body 部分替换为您的部分视图内容。如果您还没有显示对话框,那么您需要显示它。
    猜你喜欢
    • 2023-03-12
    • 2017-04-14
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多