C# 更新主窗体以在返回PartialViewResult时显示自定义验证消息

C# 更新主窗体以在返回PartialViewResult时显示自定义验证消息,c#,jquery,ajax,asp.net-mvc,asp.net-mvc-partialview,C#,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc Partialview,我有一个主视图,这个主视图有一个div标记,在对控制器进行Ajax调用之后,它将包含一个局部视图 下面是负责启动ajax调用的局部视图: @model EDR.Presentation.WebMain.ViewModels.MvcPatientDetailsHIVViewModel <div class="form-group-sm"> @Html.LabelFor(m => m.HIVTestTestDate, new { @class = "control-lab

我有一个主视图,这个主视图有一个div标记,在对控制器进行Ajax调用之后,它将包含一个局部视图

下面是负责启动ajax调用的局部视图:

@model EDR.Presentation.WebMain.ViewModels.MvcPatientDetailsHIVViewModel

<div class="form-group-sm">
    @Html.LabelFor(m => m.HIVTestTestDate, new { @class = "control-label" })
    @Html.EditorFor(m => m.HIVTestTestDate, new { htmlAttributes = new { @class = "form-control form-control-custom-50" } })
</div>

<div class="form-group-sm">
    @Html.LabelFor(m => m.HIVTestTestResult, new { @class = "control-label" })
    @Html.DropDownListFor(m => m.HIVTestTestResult, Model.SelectList_HIVTestedResult, new { @class = "form-control form-control-custom-50" })
</div>

<div class="form-group-sm">
    @Html.LabelFor(m => m.HIVTestCD4Count, new { @class = "control-label" })
    @Html.EditorFor(m => m.HIVTestCD4Count, new { htmlAttributes = new { @class = "form-control form-control-custom-50" } })
</div>

<input type="button" value="Add" id="btnAddNewTest" class="btn btn-info" />
<input type="button" value="Cancel" id="btnCancelAdd" class="btn btn-danger" />
$('#btnAddNewTest').on("click", function () {
        var date = $('#HIVTestTestDate').val();
        var result = $('#HIVTestTestResult').val();
        var cd4 = $('#HIVTestCD4Count').val();
        var pID = $('#PatientID').val();

        var dataToSend = { patientID: pID, testDate: date, resultID: result, cd4Count: cd4 };

        $.ajax({
            url: '/HIVInformation/AddHIVTest/',
            type: 'post',
            data: dataToSend,
            success: function (partialViewReceived) {
                $('#HIVTestCollection').html(partialViewReceived);
            }
        });
    });
public PartialViewResult AddHIVTest(Guid patientID, DateTime testDate, Guid resultID, int cd4Count)
        {
            MvcPatientDetailsHIVViewModel model = new MvcPatientDetailsHIVViewModel(patientID);
            model.LoadAllData();

            try
            {
                //add the HIV Test
                model.HIVTestResult = new Common.Models.PatientHIVTestModel()
                {
                    ID = Guid.NewGuid(),
                    PatientID = patientID,
                    TestDate = testDate,
                    HIVTestResultID = resultID,
                    CD4Count = cd4Count
                };

                //call the add method
                model.AddHIVTestResults();
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex);
            }

            return PartialView("_HIVTestCollection", model);
        }
以下是ajax调用正在调用的控制器中的操作:

@model EDR.Presentation.WebMain.ViewModels.MvcPatientDetailsHIVViewModel

<div class="form-group-sm">
    @Html.LabelFor(m => m.HIVTestTestDate, new { @class = "control-label" })
    @Html.EditorFor(m => m.HIVTestTestDate, new { htmlAttributes = new { @class = "form-control form-control-custom-50" } })
</div>

<div class="form-group-sm">
    @Html.LabelFor(m => m.HIVTestTestResult, new { @class = "control-label" })
    @Html.DropDownListFor(m => m.HIVTestTestResult, Model.SelectList_HIVTestedResult, new { @class = "form-control form-control-custom-50" })
</div>

<div class="form-group-sm">
    @Html.LabelFor(m => m.HIVTestCD4Count, new { @class = "control-label" })
    @Html.EditorFor(m => m.HIVTestCD4Count, new { htmlAttributes = new { @class = "form-control form-control-custom-50" } })
</div>

<input type="button" value="Add" id="btnAddNewTest" class="btn btn-info" />
<input type="button" value="Cancel" id="btnCancelAdd" class="btn btn-danger" />
$('#btnAddNewTest').on("click", function () {
        var date = $('#HIVTestTestDate').val();
        var result = $('#HIVTestTestResult').val();
        var cd4 = $('#HIVTestCD4Count').val();
        var pID = $('#PatientID').val();

        var dataToSend = { patientID: pID, testDate: date, resultID: result, cd4Count: cd4 };

        $.ajax({
            url: '/HIVInformation/AddHIVTest/',
            type: 'post',
            data: dataToSend,
            success: function (partialViewReceived) {
                $('#HIVTestCollection').html(partialViewReceived);
            }
        });
    });
public PartialViewResult AddHIVTest(Guid patientID, DateTime testDate, Guid resultID, int cd4Count)
        {
            MvcPatientDetailsHIVViewModel model = new MvcPatientDetailsHIVViewModel(patientID);
            model.LoadAllData();

            try
            {
                //add the HIV Test
                model.HIVTestResult = new Common.Models.PatientHIVTestModel()
                {
                    ID = Guid.NewGuid(),
                    PatientID = patientID,
                    TestDate = testDate,
                    HIVTestResultID = resultID,
                    CD4Count = cd4Count
                };

                //call the add method
                model.AddHIVTestResults();
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex);
            }

            return PartialView("_HIVTestCollection", model);
        }
以下是在成功/失败尝试添加新HIV测试后加载的部分视图

@model EDR.Presentation.WebMain.ViewModels.MvcPatientDetailsHIVViewModel
@using EDR.Presentation.WebMain.Helpers

@if (Model.PatientHIVTestCollection != null && Model.PatientHIVTestCollection.Count > 0)
{
    <div class="table-responsive">
        <table class="table table-hover">
            <thead>
                <tr>
                    <th>Date</th>
                    <th>Test Result</th>
                    <th>CD4 Count</th>
                    <th>Actions</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var hivTest in Model.PatientHIVTestCollection.OrderByDescending((x) => x.TestDate))
                {
                    <tr>
                        <td>@RazorHelper.ToDateString(() => hivTest.TestDate)</td>
                        <td>@RazorHelper.ToString(() => hivTest.HIVTestResult.DisplayName)</td>
                        <td>@RazorHelper.ToString(() => hivTest.CD4Count)</td>
                        <td>
                            @Ajax.ActionLink("Edit", "EditHIVTest", new { patientID = Model.PatientID, testID = hivTest.ID }, new AjaxOptions() { HttpMethod = "get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "testEdit" }, new { @class = "btn btn-info" })
                            @Ajax.ActionLink("Delete", "DeleteHIVTest", new { patientID = Model.PatientID, testID = hivTest.ID }, new AjaxOptions() { HttpMethod = "get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "HIVTestCollection" }, new { @class = "btn btn-danger" })
                        </td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
}
else
{
    <text>No Data to display</text>
}
@model EDR.Presentation.WebMain.ViewModels.MvcPatientDetailsHIVViewModel
@使用EDR.Presentation.WebMain.Helpers
@if(Model.PatientHIVTestCollection!=null&&Model.PatientHIVTestCollection.Count>0)
{
日期
测试结果
CD4计数
行动
@foreach(模型中的var hivTest.PatientHIVTestCollection.OrderByDescending((x)=>x.TestDate))
{
@RazorHelper.ToDateString(()=>hivTest.TestDate)
@RazorHelper.ToString(()=>hivTest.HIVTestResult.DisplayName)
@RazorHelper.ToString(()=>hivTest.CD4Count)
@ActionLink(“编辑”、“编辑hivTest”、新的{patientID=Model.patientID、testID=hivTest.ID}、新的AjaxOptions(){HttpMethod=“get”,InsertionMode=InsertionMode.Replace,UpdateTargetId=“testEdit”},新的{@class=“btn btn info”})
@ActionLink(“Delete”,“DeleteHIVTest”,new{patientID=Model.patientID,testID=hivTest.ID},new AjaxOptions(){HttpMethod=“get”,InsertionMode=InsertionMode.Replace,UpdateTargetId=“HIVTestCollection”},new{@class=“btn btn danger”})
}
}
其他的
{
没有要显示的数据
}
捕获异常后,我已验证验证消息是否已添加到ModelState

我知道这个局部视图是动态添加到主视图的,但是如何重置主视图以显示添加到ModelState的验证消息呢。我不想在部分视图中显示验证消息

以下是主视图上的局部视图,用于显示验证消息

@model ModelStateDictionary

@if (!Model.IsValid)
{
    <div class="panel panel-danger">
        <div class="panel-heading">Validation Errors</div>
        <div class="panel-body">
            <ul>
                @foreach (var modelError in
                             Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
                {
                    <li>@modelError.ErrorMessage</li>
                }
            </ul>
        </div>
    </div>
}
@model ModelStateDictionary
@如果(!Model.IsValid)
{
验证错误
    @foreach(var modelError)中的错误 Model.SelectMany(keyValuePair=>keyValuePair.Value.Errors)) {
  • @modelError.ErrorMessage
  • }
}
任何帮助都将不胜感激。

在您的
AddHIVTest()
controller方法中,添加
ModelState
错误几乎没有意义。这些是为在与表单关联的
ValidationSummary()
ValidationMessageFor()
帮助程序中使用而设计的,但关联的部分没有表单。例如,您可以将错误消息添加到视图模型或
ViewBag
属性中

catch (Exception ex)
{
  ViewBag.ErrorMessage = ex.ToString();
}
然后可以在该
\u HIVTestCollection
部分中呈现为(例如)


另一个选项是生成2个局部视图(其中一个有错误),并使用中描述的技术将它们作为字符串返回(在
JsonResult
中)。

您不能(除非返回主视图)。但一种选择是返回一组错误,如JSON和update,以及主视图中的一些元素来显示它们。@StephenMuecke我能看到一个工作示例吗?或者你的意思是,无论我返回什么,如果没有错误,都应该显示在原始局部视图应该呈现的位置?我现在很好奇,你的局部视图实际上在做什么。这就是它包含的全部内容,还是你有其他html?@StephenMuecke该部分有两个“文本框”和一个下拉列表。如果下拉选择与结果的总体描述不匹配,则无法添加测试。这是我希望在主视图上显示的验证消息当您返回部分时,下拉列表中选项的值是否与原始值不同?感谢您的努力Stephen,非常感谢。