我有一个Localidad
包含类属性的类Provincia
,当我想通过 Ajax 和 Jquery 进行嵌套组合时,它给了我:
错误 500 - 内部服务器错误 -。
如果我删除属性Provincia
,那就完美了。我怎样才能解决这个问题?
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace javaScript.Models
{
public class Localidad
{
public int Id { get; set; }
public string Descripcion { get; set; }
[Display(Name ="Provincia")]
public int IdProvincia { get; set; }
public Provincia Provincia
{
get { return new Provincia(this.IdProvincia); }
set { }
}
public void set_Provincia(int idProvincia)
{
this.Provincia = new Provincia(1);
}
}
}
namespace javaScript.Models
{
public class Provincia
{
// public int Id { get; set; }
public int Id { get; set; }
public string Descripcion { get; set; }
public string Gobernador { get; set; }
public List<Localidad> Localidades { get; set; }
}
}
Controller中返回列表的方法:
public ActionResult GetSecondValues(string IdProvincia)
{
IEnumerable<Localidad> localidadList = null;
var db = new Contexto();
var id = Int32.Parse(IdProvincia);
if (id > 0)
{
//se carga la lista de Localidades
localidadList = db.Localidades.Where(x => x.IdProvincia == id).ToList();
}
var retorno = Json(localidadList);
return retorno;
}
视图上的ajax方法:
<script type = "text/javascript">
$(function () {
$("#IdProvincia").change(function () {
var selectedItem = $(this).val();
var ddlStates = $("#IdLocalidad");
var statesProgress = $("#states-loading-progress");
statesProgress.show();
$.ajax({
cache: false,
type: "POST",
url: "@(Url.Action(" GetSecondValues "))",
data: {
"IdProvincia": selectedItem
},
success: function (data) {
ddlStates.html('');
$.each(data, function (id, option) {
ddlStates.append($('<option></option>').val(option.Id).html(option.Descripcion));
});
statesProgress.hide();
},
error: function (xhr, ajaxOptions, thrownError) {
alert('Failed to retrieve states.');
statesProgress.hide();
}
});
});
});
</script>
问题出在包含Localities 列表的Provinces类和包含Province类型属性的Localities类之间的递归 奇怪的是错误跳转在 ajax 方法中而不是在 Visual Studio 中,这使得它很难让我找到错误,因为 ajax 只告诉我错误 500 内部服务器错误,而且我在 JS 方面没有太多经验。删除两个属性中的任何一个(省中的地区列表,或地区中的省),代码可以正常工作。
据我了解,您得到的错误将是无法将类型 X 隐式转换为 'System.Collections.Generic.IEnumerable<Locality>'。
这是因为db.Localities返回的类型不能直接转换为Localities列表。
您可以尝试以下方法:
我看到的一个问题是您正在使用
Int32.Parse
转换字符串IdProvincia
,但如果它变为空,它将向您发送一个ArgumentNullException
,这会产生一个异常,因此 500 错误是有道理的,所以理想的情况是使用Convert.ToInt32
.理想情况下,您需要将控制器代码更改为以下内容:
但是,看到使用它填充下拉列表的结果,我建议从控制器生成 HTML:
最后,在 Ajax 调用中,只需在所需控件中呈现该 HTML: