2013-04-24 60 views
4

在控制器 'Flazingo.Controllers.PositionController'找不到公共行動方法'AddPromoCode'。在在 System.Web.Mvc.Controller.ExecuteCore()在 System.Web.Mvc.ControllerBase.Execute(RequestContext的RequestContext的) System.Web.Mvc.Controller.HandleUnknownAction(字符串actionName)在 的System.Web。 Mvc.MvcHandler。 <> c__DisplayClass6。 <> c__DisplayClassb.b__5() at System.Web.Mvc.Async.AsyncResultWrapper。 <> c__DisplayClass1.b__0() at System.Web.Mvc.MvcHandler。 <> c__DisplayClasse.b__d()在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步驟, 布爾& completedSynchronously)找不到動作只在現場服務器上,在本地服務器工作正常

這裏是Ajax調用:

$.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'); 
      } 
     }); 

編輯:POST方法

[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結構:

{"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":"[email protected]","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} 

注:呼叫淘汰賽點擊功能之內。 注:我創建了另一個問題,認爲這是客戶端問題。這是相關的。 Uncaught SyntaxError: Unexpected token B on live but not local server

+0

你可以發佈你的動作方法嗎? – 2013-04-24 18:19:55

+0

@UfukHacıoğulları添加了操作方法! – jmogera 2013-04-24 18:21:44

+0

嘿jmogera你可不可以發佈json結構,這是從該方法預計的。 – Jai 2013-04-24 18:23:24

回答

0

它找不到AddPromoCode所以,似乎有一個URL的問題。您應該在服務器中的阿賈克斯代碼中添加應用程序名稱,如url: '/ApplicationName/Position/AddPromoCode'

您還可以url.action HTML幫助做到這一點,如:

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

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

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

的部分Url.Action("", "")創建'/ApplicationName'部分動態。

相關問題