Cannot find action only on real server, works fine on local server

Public action method AddPromoCode not found on controller 'Flazingo.Controllers.PositionController. in System.Web.Mvc.Controller.HandleUnknownAction (String actionName) in System.Web.Mvc.Controller.ExecuteCore () in System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) in System.Web.Mvc.MvcHandler <. > C__DisplayClass6 <. > C__DisplayClassb.b__5 () in System.Web.Mvc.Async.AsyncResultWrapper. <> c__DisplayClass1.b__0 () in System.Web.Mvc.MvcHandler. <> c__DisplayClasse.b__d () at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () on System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Logical & completedSyn

Here is the ajax call:

$.ajax({
            url: '/Position/AddPromoCode',
            type: 'POST',
            dataType: "json",
            contentType: "application/json; charset:utf-8",
            data: ko.toJSON(viewModel),
            success: function(result){
                if(result.TypeId == 1){
                    viewModel.promoOff(viewModel.grandTotal() * (result.Value / 100));
                    viewModel.PromoCodes.push(promoCode + ": "+ result.Value + "% off");
                }else{
                    viewModel.PromoCodes.push(promoCode + ": "+ result.Value + "days free");
                }
            },
            error: function (xmlHttpRequest, textStatus, errorThrown) {
                var errorData = jQuery.parseJSON(xmlHttpRequest.responseText);
                var errorMessages = [];
                //this ugly loop is because List<> is serialized to an object instead of an array
                for (var key in errorData)
                {
                    errorMessages.push(errorData[key]);
                }
                toastr.error(errorMessages.join("<br />"), 'Uh oh');
            }
        });

EDIT: AFTER METHOD

[HttpPost]
        public ActionResult AddPromoCode(PaymentViewModel model)
        {
            List<string> errors = new List<string>();
            try
            {

                var position = db.Positions.SingleOrDefault(x => x.PositionId == model.PositionId);
                if (position != null)
                {
                    var promo = db.Promotions.SingleOrDefault(x => x.Code.ToLower() == model.PromoCode.ToLower() && x.IsUserEntered);
                    if (promo != null)
                    {
                        var promoUsage = db.PromoCodeUsages.SingleOrDefault(x => x.PromotionId == promo.PromotionId && x.ClientId == position.Client.Id);
                        int used = 0;
                        if (promoUsage != null)
                        {
                            used = promoUsage.Used;
                        }

                        if (used < promo.QuantityUsage)
                        {
                            if (DateTime.Today >= promo.StartDate && DateTime.Today <= promo.EndDate)
                            {
                                position.PromoCodes.Add(new PositionPromoCode
                                {
                                    PromotionId = promo.PromotionId
                                });

                                var clientPC = position.Client.PromoCodes.SingleOrDefault(x => x.PromotionId == promo.PromotionId);
                                if (clientPC != null)
                                {
                                    clientPC.Used = used + 1;
                                }
                                else
                                {
                                    clientPC = new PromoCodeUsage()
                                    {
                                        PromotionId = promo.PromotionId,
                                        Used = used + 1
                                    };
                                    position.Client.PromoCodes.Add(clientPC);
                                }

                                db.SaveChanges();

                                Response.StatusCode = (int)HttpStatusCode.OK;
                                return Json(new { Value = promo.Value, TypeId = promo.PromotionTypeId });

                            }
                            else
                            {
                                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                                errors.Add("Sorry seems like this promotion code has expired");
                                db.SaveChanges();
                                return Json(errors);
                            }
                        }
                        else
                        {
                            Response.StatusCode = (int)HttpStatusCode.BadRequest;
                            errors.Add("Sorry seems like you have already used this code, or its not applicable anymore!");
                            db.SaveChanges();
                            return Json(errors);
                        }
                    }
                    else
                    {
                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
                        errors.Add(string.Format("Sorry we don't have '{0}' promocode in our system!", model.PromoCode));
                        db.SaveChanges();
                        return Json(errors);
                    }
                }

                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                errors.Add("We coudn't find this position in our system!");
                db.SaveChanges();
                return Json(errors);
            }
            catch (Exception ex)
            {
                logger.Log(LogLevel.Error, string.Format("{0} \n {1}", ex.Message, ex.StackTrace));
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                errors.Add("Sorry there was internal errors, flazingo.com has been notified.");
                return Json(errors);
            }
        }

JSON structure:

{"PositionTitle":"Testing B Syntax Error","PromoCode":"FREECB","FirstName":null,"LastName":null,"Address":null,"SuiteNumber":null,"PhoneNumber":null,"City":null,"State":null,"ZipCode":null,"CreditCardNumber":null,"ExperationMonth":null,"ExperationYear":null,"CCV":null,"ClientId":2,"CustomerProfileId":64277420,"PositionId":78,"EmailAddress":"jmogera@gmail.com","Years":[{"Selected":false,"Text":"2013","Value":"2013"},{"Selected":false,"Text":"2014","Value":"2014"},{"Selected":false,"Text":"2015","Value":"2015"},{"Selected":false,"Text":"2016","Value":"2016"},{"Selected":false,"Text":"2017","Value":"2017"},{"Selected":false,"Text":"2018","Value":"2018"},{"Selected":false,"Text":"2019","Value":"2019"},{"Selected":false,"Text":"2020","Value":"2020"},{"Selected":false,"Text":"2021","Value":"2021"},{"Selected":false,"Text":"2022","Value":"2022"}],"MonthList":[{"Selected":false,"Text":"Jan","Value":"01"},{"Selected":false,"Text":"Feb","Value":"02"},{"Selected":false,"Text":"Mar","Value":"03"},{"Selected":false,"Text":"Apr","Value":"04"},{"Selected":false,"Text":"May","Value":"05"},{"Selected":false,"Text":"Jun","Value":"06"},{"Selected":false,"Text":"Jul","Value":"07"},{"Selected":false,"Text":"Aug","Value":"08"},{"Selected":false,"Text":"Sep","Value":"09"},{"Selected":false,"Text":"Oct","Value":"10"},{"Selected":false,"Text":"Nov","Value":"11"},{"Selected":false,"Text":"Dec","Value":"12"}],"IsAddingNewCard":false,"HaveCardOnFile":true,"AddOns":[{"PositionId":78,"ProductId":2,"Description":"The heart and soul, we take you through the hiring process, start to finish and give you every tool you need to make a great hire along the way.","Price":39,"HasAdded":true,"AutoRenew":true,"Name":"Complete Hiring System","AddOnId":122}],"CreditCards":[{"CreditCardId":16,"LastFour":"1060","HolderName":"Barrett Kuethen","ExpDate":"/Date(1422766800000)/","IsDefault":true}],"CardOnFile":{"CreditCardId":16,"LastFour":"1060","HolderName":"Barrett Kuethen","ExpDate":"/Date(1422766800000)/","IsDefault":true},"PromoCodes":[],"__ko_mapping__":{"CardOnFile":{},"ignore":[],"include":["_destroy"],"copy":[],"observe":[],"mappedProperties":{"PositionTitle":true,"PromoCode":true,"FirstName":true,"LastName":true,"Address":true,"SuiteNumber":true,"PhoneNumber":true,"City":true,"State":true,"ZipCode":true,"CreditCardNumber":true,"ExperationMonth":true,"ExperationYear":true,"CCV":true,"ClientId":true,"CustomerProfileId":true,"PositionId":true,"EmailAddress":true,"Years[0].Selected":true,"Years[0].Text":true,"Years[0].Value":true,"Years[1].Selected":true,"Years[1].Text":true,"Years[1].Value":true,"Years[2].Selected":true,"Years[2].Text":true,"Years[2].Value":true,"Years[3].Selected":true,"Years[3].Text":true,"Years[3].Value":true,"Years[4].Selected":true,"Years[4].Text":true,"Years[4].Value":true,"Years[5].Selected":true,"Years[5].Text":true,"Years[5].Value":true,"Years[6].Selected":true,"Years[6].Text":true,"Years[6].Value":true,"Years[7].Selected":true,"Years[7].Text":true,"Years[7].Value":true,"Years[8].Selected":true,"Years[8].Text":true,"Years[8].Value":true,"Years[9].Selected":true,"Years[9].Text":true,"Years[9].Value":true,"Years":true,"MonthList[0].Selected":true,"MonthList[0].Text":true,"MonthList[0].Value":true,"MonthList[1].Selected":true,"MonthList[1].Text":true,"MonthList[1].Value":true,"MonthList[2].Selected":true,"MonthList[2].Text":true,"MonthList[2].Value":true,"MonthList[3].Selected":true,"MonthList[3].Text":true,"MonthList[3].Value":true,"MonthList[4].Selected":true,"MonthList[4].Text":true,"MonthList[4].Value":true,"MonthList[5].Selected":true,"MonthList[5].Text":true,"MonthList[5].Value":true,"MonthList[6].Selected":true,"MonthList[6].Text":true,"MonthList[6].Value":true,"MonthList[7].Selected":true,"MonthList[7].Text":true,"MonthList[7].Value":true,"MonthList[8].Selected":true,"MonthList[8].Text":true,"MonthList[8].Value":true,"MonthList[9].Selected":true,"MonthList[9].Text":true,"MonthList[9].Value":true,"MonthList[10].Selected":true,"MonthList[10].Text":true,"MonthList[10].Value":true,"MonthList[11].Selected":true,"MonthList[11].Text":true,"MonthList[11].Value":true,"MonthList":true,"IsAddingNewCard":true,"HaveCardOnFile":true,"AddOns[0].PositionId":true,"AddOns[0].ProductId":true,"AddOns[0].Description":true,"AddOns[0].Price":true,"AddOns[0].HasAdded":true,"AddOns[0].AutoRenew":true,"AddOns[0].Name":true,"AddOns[0].AddOnId":true,"AddOns":true,"CreditCards[0].CreditCardId":true,"CreditCards[0].LastFour":true,"CreditCards[0].HolderName":true,"CreditCards[0].ExpDate":true,"CreditCards[0].IsDefault":true,"CreditCards":true,"CardOnFile":true,"PromoCodes":true},"copiedProperties":{}},"addNewCreditCardValidationGroup":{"FirstName":null,"LastName":null,"Address":null,"City":null,"State":null,"CreditCardNumber":null,"ExperationMonth":null,"ExperationYear":null,"CCV":null,"errors":[]},"promoOff":0,"grandTotal":39}

Note: the call is made as part of the click function for the knockout. Note. I created another problem, believing that this is a problem with the client side. It's related. Uncaught SyntaxError: Unexpected B token on a live but not local server

+4
source share
1 answer

It cannot find AddPromoCode, so the problem with the url seems. You must add the application name to the ajax code on the server, for example url: '/ApplicationName/Position/AddPromoCode'.

You can also do this with hell.action html helper, for example:

// In layout or view:
@Html.Hidden("urlPrefix", Url.Action("", ""))

// In Javascript
var baseUrl = $("input#urlPrefix").val();

$.ajax({ url: baseUrl + '/Position/AddPromoCode', ...

Part Url.Action("", "")dynamically creates part '/ApplicationName'.

0
source

All Articles