I am trying to call controller action method using ajax call but client side and server side validation seems not working. When I don't use ajax call then validation work find but not with this approach. Please can anyone help me with this issue?
@model iSolve.Models.Configuration.ProductsViewmodel
@{
ViewData["Title"] = "Runcase";
}
<h1>Runcase</h1>
<div class="container-fluid pt-1">
<div class="col-lg-12">
@using (Html.BeginForm("RunCase", "CallService", FormMethod.Post, new { @class = "container-fluid pt-1", id = "Runform" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="row">
<div class="col-sm-6">
<form class="form-horizontal">
<!--Drop down list (Multi selection is allowed)-->
<fieldset class="form-group">
<label for="formGroupInputLarge1" class="col-sm-7 control-label">Products</label>
<div class="col-sm-7">
@Html.ListBoxFor(m => m.ProductId, (MultiSelectList)ViewBag.productinfo, new { multiple = "multiple", @class = "form-control", id = "productlist" })
@Html.ValidationMessageFor(m => m.ProductId, "", new { @class = "text-danger" })
</div>
</fieldset>
<fieldset class="form-group">
<label for="" class="col-sm-5 control-label ">Enter Run Number</label>
<div class="col-sm-7">
@Html.TextBoxFor(m => m.RunNumber, "", new { @class = "form-control", id = "runnum" })<!-- It should not be editable while process is running-->
@Html.ValidationMessageFor(m => m.RunNumber, "", new { @class = "text-danger" })
</div>
</fieldset>
<button type="button" class="btn btn-outline-primary" id="btnstart" name="buttonstart" value="start"><span>Start Run</span></button>
<button type="button" class="btn btn-outline-primary" id="btnstop" name="buttonstop" value="stop">Stop Run</button>
@Html.ActionLink("Export to CSV", "Exporttocsv", "CallService")
</form>
</div>
</div>
}
</div>
</div>
@section scripts{
<script type="text/javascript">
$(document).ready(function () {
$("#btnstart").click(function (e) {
let productvals = $("#productlist").val();
let runnumber = $("#runnum").val();
let btnval = $("#btnstart").val();
e.preventDefault();
$.ajax({
url: "@Url.Action("CheckRunnumber","Validation")",
type: "POST",
dataType: "json",
data: { runnumber: $('#runnum').val() },
success: function (data) {
if (data.success == "True") {
console.log(data);
console.log(data.btnstartval);
//$("#Runform").submit();
$.ajax({
url: "@Url.Action("RunCase", "CallService")",
type: "POST",
dataType: "json",
data: { products: productvals, runnumber: runnumber, button: data.btnstartval }
});
}
else {
e.preventDefault();
console.log(data);
console.log(data.btnstartval);
if (confirm("Run number you have entered is already exist.Do you wish to Rerun?")) {
console.log(data.btnstartval);
$.ajax({
url: "@Url.Action("RunCase", "CallService")",
type: "POST",
dataType: "json",
data: { products: productvals, runnumber: runnumber, button: data.btnstartval }
});
} else {
e.preventDefault();
}
}
},
error: function (data) {
}
});
});
</script>
}
Below is the viewmodel class. As you guys can see I have applied data annotation to the properties.
public class ProductsViewmodel
{
[Required(ErrorMessage = "Please select at least one Product")]
public List<string> ProductId { get; set; }
[Required(ErrorMessage = "Please enter a run number")]
[MaxLength(8)]
[RegularExpression("^[0-9]*$", ErrorMessage = "Run number must be numeric only")]
public string RunNumber { get; set; }
}