2017-02-07 67 views
3

我在网页上写了一个函数,当你键入一个序列号时,它会查找SQL数据库中该序列号的哪个模型。现在,JsonResult正在工作并找到正确的信息,但是jquery和ajax出了问题,因为它在您点击序列号框(用模糊设置,它也会触发)之后没有显示出来。用Jquery和Ajax返回数据

这里是控制器代码。

public JsonResult SerialNumberSearch(string serialnum) 
    { 
     var result = db.IASerialNoMasters.Where(x => x.SerialNo == serialnum).Select(x => x.Model).Single().ToString(); 

     return Json(result, JsonRequestBehavior.AllowGet); 
    } 

这是我目前在我的视图中的脚本。

<script type="text/javascript"> 
    var serialnum; 
    var url = '@Url.Action("SerialNumberSearch", "WarrantyRegistration")' 
    $("#SerialNum").blur(function() { 
     GetLiftModel(); 
    }); 
    function GetLiftModel() { 
     serialnum = $("#SerialNum").val(); 
     $.ajax({ 
      type: "GET", 
      url: url, 
      data: { serialnum: serialnum }, 
      success: function(data) { 
       $('#ModelName').val(data.Model); 
      } 
     }) 
    } 
</script> 

这是视图上文本框的代码。

 <div class="row"> 
      @Html.TextBoxFor(model => model.SerialNum, new { placeholder = "Serial #" }) 
      @Html.ValidationMessageFor(model => model.SerialNum, null, new { @class = "text-danger" }) 
     </div> 

     <br /> 

     <div class="column-1"> 
      @Html.TextBoxFor(model => model.ModelName, new { placeholder = "Model" }) 
      @Html.ValidationMessageFor(model => model.ModelName, null, new { @class = "text-danger" }) 
     </div> 

任何人都可以告诉我从代码的函数GetLiftModel区域缺少什么?

回答

1

您确定要显示data.Model?如果您返回JsonResult,则data变量实际上是您的序列号的代表,因此data.Model实际上可能是undefined。 尝试将其更改为

$.ajax({ 
     type: "GET", 
     url: url, 
     data: { serialnum: serialnum }, 
     success: function(data) { 
      $('#ModelName').val(data); 
      } 
     }) 

基于事实,你正在返回另一方面只是string没有理由退换货JsonResult。你可以改变你的控制器方法的签名

public JsonResult SerialNumberSearch(string serialnum) 
{ 
    var result = db.IASerialNoMasters 
        .Where(x => x.SerialNo == serialnum) 
        .Select(x => x.Model).Single().ToString(); 
    return result; 
} 
+0

这结束了工作,谢谢!我已经坚持了几个小时。我只是测试它,它带来了正确的部分。 – bubbajake00

+0

不客气。另外,我建议你考虑一下你的LINQ查询。如果没有匹配的序列号会怎么样?现在你抛出异常,你可以让我们知道客户端,并优雅地将其展示给用户界面。 –

+0

哦,是的,我刚刚完成编码。我只是担心在我开始复杂化代码之前先获取数据。 – bubbajake00

1

这最终取决于你想访问哪些,如果你需要访问多个属性:

  • 需要一个单一的财产?如果您只需要一个属性,那么您应该能够将该属性隔离为与当前代码类似,并且只传回该属性。
  • 需要多个属性?然后,您可能需要从SerialNumberSearch()方法中返回整个对象或至少部分对象。

返回单个属性

您当前的代码有一个最终ToString()调用,似乎表明你的Model财产只返回一个单一的财产,在这种情况下:

var result = db.IASerialNoMasters 
       .Where(x => x.SerialNo == serialnum) 
       .Select(x => x.Model) 
       .Single() 
       .ToString(); // This returns a string 

由于这种情况,您正在返回的data对象将已经包含该特定属性,因此您只需使用data如下:

success: function(data) { 
    // data will already contain your result, so just use it 
    $('#ModelName').val(data); 
} 

返回多个属性或对象图

如果你希望能够在JSON你的对象访问多个属性,你会想实际上会返回对象本身,让串行处理它传递给Java脚本,以便它可以预期使用:

public JsonResult SerialNumberSearch(string serialnum) 
{ 
    var result = db.IASerialNoMasters 
        .SingleOrDefault(x => x.SerialNo == serialnum);; 
    if(result == null) 
    { 
     // Do something if it doesn't exist 
     return HttpNotFound(); 
    } 
    return Json(result, JsonRequestBehavior.AllowGet); 
} 

,然后简单地从你的data对象中获取你需要的财产你使用Javascript代码:

success: function(data) { 
    // data will already contain your result, so just use it 
    $('#ModelName').val(data.Model); 
}    
+0

你取出的ToString(的建议)并最终获取的序列号相同的部分,雅罗斯拉夫的解决方案最终将在正确的数据。感谢您的帮助! – bubbajake00

+0

我已经更新了我的回复。你原来的帖子并不是非常清楚,“Model”只是一个返回的字符串(因为我认为它是另一个类)。无论哪种方式,我已经添加了处理单个属性或返回整个图形的示例,希望能够澄清事情。 –

+0

对不起!我对jquery和ajax很陌生,所以我没有意识到有什么不同。 – bubbajake00