Requirement: I have a referral form, where user can fill in the details to apply for a job. Now, As per my requirement, if a user wants to reapply for the same job, he can do so, multiple number of times (humor me on this). So, If I detect that user has already applied for the job before then I need to update the old referral request, if not then create a new request.
Current Behaviour: I have successfully written the logic to overwrite the existing value (if user had already applied before). But I want to show a pop up or some confirmation, if I detect that the user has already applied to this job, before updating resume and datetime and other fields. And once user says Yes, then only I want to overwrite the values.
Issue: I have no clue how to achieve above. Because once the request goes to backend controller action then only I can detect that this is something new or this is something which is already existing and needs to be overwritten and a POP UP needs to be shown.
View:
@model Bridge.ViewModels.ReferralViewModel
@using (Html.BeginForm())
{
<div class="form-horizontal">
<h4>Job Request</h4>
<div class="form-group">
@Html.LabelFor(model => model.CompanyId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(m => m.CompanyId, Model.Companies, "Please Select", new { @class = "form-control", data_url = Url.Action("ListOfCoverLetterByCompanyId", "Referral") })
</div>
</div>
@* SOME FIELDS REMOVED FOR BREVITY*@
<div class="form-group">
@Html.LabelFor(model => model.ResumeId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(m => m.ResumeId, Model.Resumes, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.CoverLetterId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(m => m.CoverLetterId, Model.CoverLetters, "Please select", new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
Controller Action
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ReferralViewModel viewModel)
{
var candidateId = User.Identity.GetUserId();
var referral = _context.Referrals.Where(r => (r.CandidateId == candidateId) && (r.CompanyId == viewModel.CompanyId)).SingleOrDefault();
if (referral != null)
{
// if already existing then show a confirmation/warning before updating
referral.ResumeId = viewModel.ResumeId;
referral.CoverLetterId = viewModel.CoverLetterId;
referral.dateTime = DateTime.Now;
}
else
{
// If new then add the entry
}
_context.SaveChanges();
return RedirectToAction("ReferralCenter");
}
EDIT
Attempt 1:
View:
@section scripts {
<script>
$('form').submit(function () {
var data = $('form').serialize();
var url = '@Url.Action("CheckForExistingReferral")';
$.ajax({
url: url,
type: 'POST',
data: data,
success(data)
{
debugger;
alert("hello");
// some logic
},
error()
{
debugger;
alert("error");
//some logic
}
});
});
</script>
}
AJAX Action:
[HttpPost]
public JsonResult CheckForExistingReferral(ReferralViewModel viewModel)
{
bool hasPreviousRequest = false;
var candidateId = User.Identity.GetUserId();
var referral = _context.Referrals.Where(r => (r.CandidateId == candidateId) && (r.CompanyId == viewModel.CompanyId) && (r.SkillId == viewModel.SkillId) && (string.IsNullOrEmpty(r.ReferrerId))).SingleOrDefault();
hasPreviousRequest = referral != null;
return Json(new { hasPreviousRequest = hasPreviousRequest });
}
Issue:
Breakpoint at JSON Function gets hit, but before it can return the result, my Actual Form POST Method breakpoint gets hit. I want the Form POST controller action to wait for AJAX call return.
Attempt 2
View
@section scripts {
<script>
var canSubmit = false;
debugger;
$('form').submit(function (e) {
if (!canSubmit)
e.preventDefault();
var data = $('form').serialize();
var url = '@Url.Action("CheckForExistingReferral")';
$.ajax({
url: url,
type: 'POST',
data: data,
success(response){
if (response.hasPreviousRequest)
{
if (confirm("You've already applied for this job. Apply again?")) {
canSubmit = true;
$('form').submit();
}
}
else {
canSubmit = true;
$('form').submit();
}
},
error(){
alert("error");
}
});
});
</script>
}
Issue: For single click, my Json Action gets hit atleast 3 times. It should be hit just once.
Attempt 3
Gave an Id to the form:
@using (Html.BeginForm("Create", "Referral", FormMethod.Post, new { id = "job-form" }))
{}
Script:
@section scripts {
<script>
var canSubmit = false;
debugger;
$('#job-form').submit(function (e) {
if (!canSubmit)
e.preventDefault();
var data = $('#job-form').serialize();
var url = '@Url.Action("CheckForExistingReferral")';
$.ajax({
url: url,
type: 'POST',
data: data,
success: function (response) {
if (response.hasPreviousRequest)
{
if (confirm("You've already applied for this job. Apply again?")) {
canSubmit = true;
$('#job-form').submit();
}
}
else {
canSubmit = true;
$('#job-form').submit();
}
},
error: function (){
alert("error");
}
});
});
</script>
}
ISSUE: I keep on seeing the JS Pop up in a loop.