Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个AJAX.Helper Post调用会出现Enity框架错误,但是;获得;不';T_Ajax_Asp.net Mvc_Entity Framework_Asp.net Web Api2_Ajaxhelper - Fatal编程技术网

为什么这个AJAX.Helper Post调用会出现Enity框架错误,但是;获得;不';T

为什么这个AJAX.Helper Post调用会出现Enity框架错误,但是;获得;不';T,ajax,asp.net-mvc,entity-framework,asp.net-web-api2,ajaxhelper,Ajax,Asp.net Mvc,Entity Framework,Asp.net Web Api2,Ajaxhelper,作为一个学习项目,我有一个MVC&Typescript项目和一个Web2.0&entity框架项目,MVC项目试图与Web2.0项目对话,我有一个奇怪的错误 这是我的Web API 2.0播放器控制器: public class PlayerController : ApiController { // GET api/<controller>/5 public Player Get(int? id) { if (id == null ||

作为一个学习项目,我有一个MVC&Typescript项目和一个Web2.0&entity框架项目,MVC项目试图与Web2.0项目对话,我有一个奇怪的错误

这是我的Web API 2.0播放器控制器:

 public class PlayerController : ApiController
{

    // GET api/<controller>/5
    public Player Get(int? id)
    {
        if (id == null || id == -1)
        {

            var player = new Player();
            LeaderBoardContext.Current.Players.Add(player);
            LeaderBoardContext.Current.SaveChanges();
            return player;
        }
        return LeaderBoardContext.Current.Players.FirstOrDefault(x => x.PlayerId == id);
    }


    // PUT: api/Scores/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PostPlayer(LearningCancerAPICalls.Models.Player player)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var model = LeaderBoardContext.Current.Players.FirstOrDefault(x => x.PlayerId == player.PlayerId);
        LeaderBoardContext.Current.Entry<Player>(player).State = EntityState.Modified;

        try
        {
            LeaderBoardContext.Current.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {

        }
        return StatusCode(HttpStatusCode.NoContent);
    }
}
因此,第一个奇怪之处是,在后文中,上下文坚持为空,但通过上述复杂的方法强迫它不为空,并没有对情况有多大改善。请注意,我现在输入的第一个EF调用与GET基本相同:

var model = LeaderBoardContext.Current.Players.FirstOrDefault(x => x.PlayerId == player.PlayerId);
我在这两种样式中都调用了GET(使用-1,使用有效ID),它工作正常,但帖子到目前为止导致了以下错误:

我通常会把它和一个初始化不好的EF项目联系在一起,但是GET有效!它做的正是它应该做的。我甚至试着用不同的型号向EF scafold控制器发帖,但都遇到了同样的问题

两者之间的主要区别(除了GET/POST)是我对它们的称呼方式,这就是我使用GET的方式:

    var playerId = -1;
var activeUser:Player;
function initPlayerOnGameStart() {
    if (host === undefined) {
        host = 'http://localhost:52316';
    }
    if (playerId === undefined) {
        playerId = -1;
    }
    var uri = host + '/api/Player/' + playerId;
    jQuery.getJSON(uri).done(data => {
        activeUser = data;
        playerId = activeUser.PlayerId;
    });

}
在纯类型脚本Json调用中。为了完成本文,我正在试验AJAX.Helper:

    @model LearningCancerAPICalls.Models.Player

<a id="contact-us">Share Score!</a>
<div id="contact-form" class="hidden" title="Online Request Form">
    @using (Ajax.BeginForm("", "", null, new AjaxOptions
    {
        HttpMethod = "POST", Url = "/api/Player",
        OnSuccess ="OnSuccess",
        OnFailure ="OnFailure" 
    }, new { id = "formId", name = "frmStandingAdd" }))
    {
        @Html.LabelFor(m => m.PlayerName);
        @Html.TextBoxFor(m => m.PlayerName);
        @Html.LabelFor(m => m.Email);
        @Html.TextBoxFor(m => m.Email);
        @Html.HiddenFor(m => m.PlayerId);
        @Html.Hidden( "PlayerId");
         <input type="submit" name="submit" value="Ok" />

    }
</div>

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script>
    function OnSuccess() {
        alert('Success');
    }
    function OnFailure(ajaxContext) {

        alert('Failure');
    }

</script>
@model learningcancerapacalls.Models.Player
分享分数!
@使用(Ajax.BeginForm(“,”,null,新的AjaxOption)
{
HttpMethod=“POST”,Url=“/api/Player”,
OnSuccess=“OnSuccess”,
OnFailure=“OnFailure”
},新的{id=“formId”,name=“frmStandingAdd”})
{
@LabelFor(m=>m.PlayerName);
@TextBoxFor(m=>m.PlayerName);
@LabelFor(m=>m.Email);
@Html.TextBoxFor(m=>m.Email);
@HiddenFor(m=>m.PlayerId);
@Html.Hidden(“PlayerId”);
}
函数OnSuccess(){
警惕(“成功”);
}
函数OnFailure(ajaxContext){
警报(“故障”);
}
我从打字稿中设置PlayerID的地方。这将成功调用post,但在首次使用EF时崩溃。另一件奇怪的事情是,如果我在帖子上放一个调试。该模型似乎不正确,例如,当我将鼠标悬停在它上面时,它显示为一个玩家模型,没有铸造错误,但它不允许我扩展其属性。如果我使用变量或imediate窗口来检查变量,那么它们都很好。但我觉得值得一提

稍后我将尝试一个纯ajax调用,看看它是否解决了这个问题,但我不明白为什么ajax.helper会在这里出错,它在技术上完成了它的工作,并且错误与我所看到的模型无关

更新1 所以我尝试了纯ajax调用:

Html:

名称:
好啊
打字稿

function postJustPlayer() {
    let level = jQuery("#chooseGridLevel").val();
    let name = jQuery("#userName").val();
    let uri = host + '/api/Player';
    let player: Player = <Player>{};


    player.Email = "Testing";
    player.PlayerName = name;
    jQuery.post(uri, player);
}
函数postJustPlayer(){
让level=jQuery(“#chooseGridLevel”).val();
让name=jQuery(“#userName”).val();
让uri=host+'/api/Player';
让玩家:玩家={};
player.Email=“测试”;
player.PlayerName=名称;
post(uri,播放器);
}

这个有效吗!??我不知道为什么纯jQuery可以工作,当然就EF而言,它也可以做同样的事情吗?为什么AJAX.helper帖子会有所不同…

解决了这个问题!这是一个真正的难题,只有在我深入研究网络数据(tools ftw)时才得以解决

对于其他网络新手,我将解释我是如何发现这个问题的。在Chrome开发工具中,有一个网络选项卡,显示您的web请求和响应。因此,单击“确定”按钮后打开它,我可以看到我的纯AJAX调用:

然后,我可以将其与我在ajax表单上单击“提交”时进行比较:

我将它们复制并粘贴到KDiff3中,这突出了一个非常重要的区别,即本地主机地址

您会注意到,在纯ajax请求中,我指定了主机,这是因为正如我所提到的,我的web api项目和我的web项目是分开的,因此它们位于不同的主机上

所以,实际上,AJAX助手调用本来就不应该起作用,但就在我决定在我的网站项目中需要一个API项目的模型的前一天,当时我想“我可能不应该在我的主网站中包含我的API项目作为参考,但就目前而言……”。因此,这会导致API调用错误的主机是有效的!当然,基本区别在于EF不是在主机上设置的

所以可怜的老ajax助手因为一个只有特殊类型的傻瓜设置才能导致的错误而受到我的诅咒。更改ajax帮助程序以使用完整路径:

    @model LearningCancerAPICalls.Models.Player

<a id="contact-us">Share Score!</a>
<div id="contact-form" class="hidden" title="Online Request Form">
    @using (Ajax.BeginForm("", "", null, new AjaxOptions
    {
        HttpMethod = "POST", Url = "http://localhost:52316/api/Player",
        OnSuccess ="OnSuccess",
        OnFailure ="OnFailure" 
    }, new { id = "formId", name = "frmStandingAdd" }))
    {
        @Html.LabelFor(m => m.PlayerName);
        @Html.TextBoxFor(m => m.PlayerName);
        @Html.LabelFor(m => m.Email);
        @Html.TextBoxFor(m => m.Email);
        @Html.HiddenFor(m => m.PlayerId);
        @Html.Hidden( "PlayerId");
         <input type="submit" name="submit" value="Ok" />

    }
</div>

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script>
    function OnSuccess() {
        alert('Success');
    }
    function OnFailure(ajaxContext) {

        alert('Failure');
    }

</script>
@model learningcancerapacalls.Models.Player
分享分数!
@使用(Ajax.BeginForm(“,”,null,新的AjaxOption)
{
HttpMethod=“POST”,Url=”http://localhost:52316/api/Player",
OnSuccess=“OnSuccess”,
OnFailure=“OnFailure”
},新的{id=“formId”,name=“frmStandingAdd”})
{
@LabelFor(m=>m.PlayerName);
@TextBoxFor(m=>m.PlayerName);
@LabelFor(m=>m.Email);
@Html.TextBoxFor(m=>m.Email);
@HiddenFor(m=>m.PlayerId);
@Html.Hidden(“PlayerId”);
}
函数OnSuccess(){
警惕(“成功”);
}
函数OnFailure(ajaxContext){
警报(“故障”);
}
解决了这个问题!感谢所有对这一问题感到困惑的人,希望这一奇怪错误的分解对某些人有用

function postJustPlayer() {
    let level = jQuery("#chooseGridLevel").val();
    let name = jQuery("#userName").val();
    let uri = host + '/api/Player';
    let player: Player = <Player>{};


    player.Email = "Testing";
    player.PlayerName = name;
    jQuery.post(uri, player);
}
    @model LearningCancerAPICalls.Models.Player

<a id="contact-us">Share Score!</a>
<div id="contact-form" class="hidden" title="Online Request Form">
    @using (Ajax.BeginForm("", "", null, new AjaxOptions
    {
        HttpMethod = "POST", Url = "http://localhost:52316/api/Player",
        OnSuccess ="OnSuccess",
        OnFailure ="OnFailure" 
    }, new { id = "formId", name = "frmStandingAdd" }))
    {
        @Html.LabelFor(m => m.PlayerName);
        @Html.TextBoxFor(m => m.PlayerName);
        @Html.LabelFor(m => m.Email);
        @Html.TextBoxFor(m => m.Email);
        @Html.HiddenFor(m => m.PlayerId);
        @Html.Hidden( "PlayerId");
         <input type="submit" name="submit" value="Ok" />

    }
</div>

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script>
    function OnSuccess() {
        alert('Success');
    }
    function OnFailure(ajaxContext) {

        alert('Failure');
    }

</script>