问题描述
我正在做一个 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)
...
}