ASP.NET Framework MVC 验证后使用 ajax 将 Razor View 数据发送到服务器

问题描述

我正在做一个 ASP.NET Framework MVC 项目,我需要使用 Jquery Ajax 将组合框从下面的局部视图中选择的项目发送到服务器,但这些组合框必须首先进行验证,然后然后数据必须在视图模型Ajax中发送到控制器中的操作(DigestFile(ModelDto Mappings))。我的项目部分如下:

局部视图如下:

    @using Web.Library.Bases;
    @inherits  Common.DataTransferObjects.Originals.ModelDto
    @{
        Layout = "";
        List<(string Caption,bool IsAsigned,bool IsMandatory,bool IsSelected,string Name,string Title)> dataBaseFields = ViewBag.DataBaseFields;
        int counter = 0;
     }
    <div id="Excel_B" class="editor-block">
        @Html.Hidden("IsNotMatched")
        <div class="block-label">
            <p class="vertical-text">
                تناظر فیلدها
            </p>
        </div>
        <div class="block-content">
            @foreach (var chlItem in dataBaseFields)
            {
                <div id="ExcelFields_G" class="editor-group ">
                    <div id="ExcelFields_L" class="editor-label mandatory">
                        <span class="MappingLabel">@chlItem.Caption :</span>
                    </div>
                    @switch (chlItem.Name)
                    {
                        case "RowNumber":
                            <div id="ExcelFields_A" class="editor-field ">
                                @Html.EditorFor(model => model.RowNumber,"ComboBox")
                                @Html.ValidationMessageFor(model => model.RowNumber)
                            </div>
                            break;
                        case "Name":
                            <div id="ExcelFields_B" class="editor-field ">
                                @Html.EditorFor(model => model.Name,"ComboBox")
                                @Html.ValidationMessageFor(model => model.Name)
                            </div>
                            break;
                        case "Family":
                            <div id="ExcelFields_C" class="editor-field ">
                                @Html.EditorFor(model => model.Family,"ComboBox")
                                @Html.ValidationMessageFor(model => model.Family)
                            </div>
                            break;
                        case "Code":
                            <div id="ExcelFields_D" class="editor-field ">
                                @Html.EditorFor(model => model.Code,"ComboBox")
                                @Html.ValidationMessageFor(model => model.Code)
                            </div>
                            break;
                        case "NationalCode":
                            <div id="ExcelFields_E" class="editor-field ">
                                @Html.EditorFor(model => model.NationalCode,"ComboBox")
                                @Html.ValidationMessageFor(model => model.NationalCode)
                            </div>
                            break;
                        default:
                            break;
            }
            </div>
        }
    </div>
    @if (Model.IsNotMatched > 0)
        {
            <div class="DigestBut" title="Read File">
                <a href="#" class="submitLink" onclick="DigestButtonClicked()">
                    Read File
                </a>
            </div>
        }
</div>
</div>

视图模型如下:

namespace Common.DataTransferObjects.Originals
{
    public class ModelDto
    {
        [display(Name = "RowNumber")]
        [required(ErrorMessageResourceName = "required",ErrorMessageResourceType = typeof(FoundationValidationMessages))]
        public string RowNumber { set; get; }

        [display(Name = "Name")]
        [required(ErrorMessageResourceName = "required",ErrorMessageResourceType = typeof(FoundationValidationMessages))]
        public string Name { set; get; }

        [display(Name = "Family")]
        [required(ErrorMessageResourceName = "required",ErrorMessageResourceType = typeof(FoundationValidationMessages))]
        public string Family { set; get; }

        [display(Name = "Code")]
        [required(ErrorMessageResourceName = "required",ErrorMessageResourceType = typeof(FoundationValidationMessages))]
        public string Code { set; get; }

        [display(Name = "NationalCode")]
        [required(ErrorMessageResourceName = "required",ErrorMessageResourceType = typeof(FoundationValidationMessages))]
        public string NationalCode { set; get; }
    }
}

操作如下:

public ActionResult DigestFile(ModelDto Mappings)
{
  ....
}

解决方法

如果您要同时发送许多“条目”以保存在控制器中,您必须执行以下操作,但当然您可以使用它只发送一个:

在您看来:

#3

在您的控制器中:

<input id="Button1" type="button" value="button" onclick="SaveMe()" />
<script>
function SaveMe() {

    // Get the value of your edit

    var RowNumber0 = $("#RowNumber").val();
    var Name0 = $("#Name").val();
    var Family0 = $("#Family").val();
    var Code0= $("#Code").val();
    var NationalCode0= $("#NationalCode").val();


    // Creat Object

    var lineItems = new Object();
    lineItems.Entrys = new Array();

    // Example Filling your object...

    lineItems.Entrys[0] = new Object({ RowNumber: RowNumber0,Name: Name0,Family: Family0,Code : Code0,NationalCode: NationalCode0 });

    //lineItems.Entrys[1] = ... same logic for your other entries


    // send by ajax to your controller and getting answer ...
    $.ajax({
        type: "POST",url: "/Home/AjaxMethodDigestFile",data: JSON.stringify({ Entrys: lineItems.Entrys }),contentType: "application/json; charset=utf-8",dataType: "json",success: function (response) { alert(response.message); },failure: function (response) { alert("failure"); },error: function (response) { alert("error"); }
    });
}

}

编辑: 关于验证

我不知道您使用的库 [HttpPost] public JsonResult AjaxMethodDigestFile(ICollection<Common.DataTransferObjects.Originals.ModelDto > Entrys) { string message = ""; int counter = 0; foreach (var entry in Entrys) { // How to use this data example string RowNumber = entry.RowNumber; string Name= entry.Name; counter += 1; message += "Saved " + ": " + counter + Constants.vbCrLf; } // The following lines are not necessary,it's just an example code to know what happen and return it to client side ... if (counter > 0) message = counter.ToString() + " Entrys received" + Constants.vbCrLf + message; else message = "no entrys"; var response = new { counter,message }; return Json(response); 所以对此无济于事,但我尝试了一种经典的工作方式:

在模型中:

FoundationValidationMessages

在视图中:

[Required(ErrorMessage = "Required")]
public string RowNumber { set; get; }

在你的控制器中:

@using (Html.BeginForm("Test2","Home",FormMethod.Post))
{
...
@Html.EditorFor(model => model.RowNumber)
@Html.ValidationMessageFor(model => model.RowNumber)
...
}