2013-08-30 3 views
0

У меня есть вид сетки div в html, в котором я делаю некоторые записи. Если щелкнуть по редактированию, откроется всплывающее окно, и пользователь сможет отредактировать запись, и данные будут сохранены в базе данных. После сохранения данных моя сетка должна обновиться.ajax jquery post не работает в mvc

Все эти вызовы контроллерам mvc, которые мы используем с помощью ajax, но сетка не освежает. какая-то проблема в ajay post, метод успеха для «refreshRules» никогда не запускается, когда он отлично работает для других действий, таких как «saveMetricRule», «metricruleeditor»

Может кто-нибудь посоветует мне, что я делаю неправильно здесь?

ниже является JQuery код блока:

var m_oConfig = { 

     editMetricRule: { 
      ds: "/stealth/metricruleeditor", 
      p: function (config, elem) { return YAHOO.stealth.editMetricRuleP(config, elem); }, 
      s: function (axn, config, elem, data, textStatus, jqXHR) { YAHOO.stealth.editRuleS(axn, config, elem, data, textStatus, jqXHR); } 
     }, 

     saveMetricRule: { 
      ds: "/stealth/saveMetricRule", 
      p: function (config, elem) { return YAHOO.stealth.saveMetricRuleP(config, elem); }, 


      s: function (axn, config, elem, data, textStatus, jqXHR) { YAHOO.stealth.saveMetricRuleS(axn, config, elem, data, textStatus, jqXHR); } 
     }, 

     refreshRules: { 
      ds: "/stealth/metricsrefresh", 
      p: function (config, elem) { return YAHOO.stealth.refreshRulesP(config, elem); }, 
      s: function (axn, config, elem, data, textStatus, jqXHR) { YAHOO.stealth.refreshRulesS(axn, config, elem, data, textStatus, jqXHR); } 
     } 

refreshRulesP: function (config, elem) { 
     return { 
      gid: $(elem).attr("data-gid"), 
     }; 
    }, 
    refreshRulesS: function (axn, config, elem, data, textStatus, jqXHR) { 
     var sRoot = "rules"; 

     $("#" + sRoot).replaceWith(data); 

     YAHOO.stealth.bindMetricGrids(sRoot); 
    }, 


    saveMetricRuleP: function (config, elem) { 
     var sErrMsg = "There are errors in the rule."; 

     //rErr class added during any change 
     if ($(".rErr").length) { 
      //update rule pop-in 
      YAHOO.stealth.ErrHndlr(sErrMsg, "pnlRuleError"); 

      //cancel ajax (and update actual page) 
      throw ""; 
     } 

     //return the rule 
     return { 
      rule: YAHOO.stealth.getRuleObj() 
     }; 
    }, 

    saveMetricRuleS: function (axn, config, elem, data, textStatus, jqXHR) { 
     //close the pop-in 
     CSUtils.DisablePop(); 

     //refresh the rules 
     YAHOO.stealth.loadNaked("refreshRules", null, elem); 

     //Indicate to user that they must run the rules 
     YAHOO.stealth.needRuleRun(data.msg, elem); 
    }, 


loadNaked: function (axn, config, elem) { 
     if (BlockAjax 
      || (!axn || axn == "")) { return; } 

     var oAxn = m_oConfig[axn]; 

     try { 
      $.ajax({ 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: oAxn.ds, 
       data: JSON.stringify(oAxn.p(config, elem)), 
       success: function (data, textStatus, jqXHR) { 
        alert('s'); 
        //if they defined a success function (s), call it with all the init and return data 
        if (typeof oAxn.s === "function") { 
         oAxn.s(axn, config, elem, data, textStatus, jqXHR) 
        } 

        //any dependent actions need to be called as well 
        if (oAxn.deps && oAxn.deps.length > 0) { 
         $.each(oAxn.deps, function (idx, dep) { 
          YAHOO.stealth.loadNaked(dep, config, elem); 
         }); 
        } 
       }, 
       error: function (err, type, msg) { 
        YAHOO.stealth.ErrHndlr(err.responseText); 
       } 
      }); 
     } catch (err) { 

      if (err && err !== "") { 
       YAHOO.stealth.ErrHndlr(err.responseText); 
      } 

      BlockAjax = false; //if it was set, we should unset it 
     } 
    }, 

действия регулятора:

public ActionResult metricsrefresh(int gid) 
    { 
     UIGrid oGrid = this.metricRulesGrid(gid); 

     string myString = RenderViewToString(this.ControllerContext , MVCConstants.VIEW_LISTABLE, this.metricRulesGrid(gid)); 

     return this.Json(new 
     { 
      myString 
     }); 

    } 


    public ActionResult saveMetricRule(Rule rule) 
    { 
     bool IsNew = rule.RuleId == 0; 

     using (NewAngieDataContext oAngieCtxt = new NewAngieDataContext(new CSConfigurationMgr().GetConnectionString(ConnectionStringKey.Angie))) 
     { 
      if (IsNew) 
       oAngieCtxt.Rules.InsertOnSubmit(rule); 
      else 
      { 
       RuleCondition oRuleCon = null; 
       foreach (RuleCondition childItem in rule.RuleConditions) 
       { 
        oRuleCon = 
          oAngieCtxt.RuleConditions 
           .Where(CON => CON.RuleConditionId == childItem.RuleConditionId) 
           .FirstOrDefault(); 

        oRuleCon.Points = childItem.Points; 
        oRuleCon.ConditionValue = childItem.ConditionValue; 
        oRuleCon.ToOperatorId = childItem.ToOperatorId; 
        oRuleCon.Sort = childItem.Sort; 
       } 

       oAngieCtxt.Rules.Attach(rule); 
       oAngieCtxt.Refresh(RefreshMode.KeepCurrentValues, rule); 
      } 
      oAngieCtxt.SubmitChanges(); 
     } 

     return this.Json(new 
     { 
      msg = "Successful save.", 
      ruleId = rule.RuleId 
     }); 
    } 
+0

Это фактически работает на развернутом сайте. но не работает в localhost, может быть, потому что символы post action не загружаются в режиме отладки, любой взгляд на это? – mmssaann

+0

Слишком много кода. Не могли бы вы создать меньшую выборку? – mswietlicki

ответ

0

Если это работает на производстве, а не на локальном хосте, что указывало бы, что URL-адреса, где вы находитесь размещение данных является абсолютным, а не относительно корня сайта (подробности ниже предлагаемого решения).

Вы можете попробовать заменить абсолютные URL-адреса динамически создаваемыми URL-адресами на сервере. То есть вместо этого в вашем JavaScript:

editMetricRule: { 
     ds: "/stealth/metricruleeditor", 

попробовать что-то вроде этого:

editMetricRule: { 
     ds: @Url.Action("metricruleeditor", "stealth"), 

Это хорошая практика, чтобы сделать это в любом случае;)


Детали:

Итак, он работает на сервере, где ваш корень может быть:

http://myserver.com/ 

так, это /stealth/metricruleeditor становится:

http://myserver.com/stealth/metricruleeditor 

Но, на локальном хосте корневая может быть:

http://localhost/myAppName 

и правильный URL для отправки данных является:

http://localhost/myAppName/stealth/metricruleeditor 

но, "/ stealth/metricrul eeditor»в вашем JS переводится:

http://localhost/stealth/metricruleeditor 

Вы можете подтвердить это, глядя на Дев инструментов в вашем браузере и мониторинг сетевого трафика: запросы и ответы сервера.

Смежные вопросы