我想获取所有状态使用状态表中country的引用键来json结果所以我可以在ASP.NET MVC的下拉列表中级联并出现此错误:
The parameters dictionary contains a null entry for parameter 'countryId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.JsonResult StateList(Int32)' in '_5._1_Presentation.MVC.Areas.Registration.Controllers.RegistrationController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
这是我的服务,控制器回购查询
控制器
public JsonResult StateList(int countryId)
{
var state = _countryState.GetAllState(countryId);
return Json(new SelectList(state, "CountryId", "StateName"), JsonRequestBehavior.AllowGet);
}
服务
public IEnumerable<State> GetAllState(int countryId)
{
var GetallState = UnitOfWork.State.GetAllStateByCountry(countryId);
return GetallState.ToList();
}
回购查询
public class StateRepository : BaseRepository<State>, IStateRepository
{
public StateRepository(DbContext context)
: base(context)
{
}
public IQueryable<State> GetAllStateByCountry(int Id)
{
DbSet.Where(dto => dto.CountryId == Id)
.Include(dto => dto.Country);
return DbSet;
}
}
这就是我得到的全部,但我真的无法弄清楚问题即将到来...... 真的会感谢你的帮助......
这是控制器呼叫国家/地区的下拉列表
public ActionResult Index()
{
var queryCountry = _countryState.GetAllCountry();
ViewBag.CountryName = new SelectList(queryCountry, "CountryId", "CountryName"));
return View();
}
答案 0 :(得分:0)
将countryId nullable
设为:
public JsonResult StateList(int? countryId)
{
if(countryId != null){
var state = _countryState.GetAllState(countryId);
return Json(new SelectList(state, "CountryId", "StateName"), JsonRequestBehavior.AllowGet);
}
else{
return Json(new{ }, JsonRequestBehavior.AllowGet);
}
}
答案 1 :(得分:0)
错误在于您如何调用操作方法。您没有传递countryId
,但由于它不是可空类型,因此抛出异常。
你可以:
将countryId
更改为int?
(但您需要在null
中处理StateList
,因为GetAllState
不会int?
)
或
您可以查看调用操作的方式,并确保传递countryId
。
修改强>
在你对@ Exception的答案的评论中,你提到你正在调用这样的URL:
本地主机:28636 /注册/注册/ StateList / 1
如果您使用的是默认路由,则您将拥有如下定义的路由:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这会尝试将您发送的1
映射到名为id
的参数,但您的参数名为countryId
,因此没有映射任何值到countryId
。由于countryId
不可为空,因此会引发异常。
将参数重命名为id
,如下所示:
public JsonResult StateList(int? id)
{
var state = _countryState.GetAllState(id);
return Json(new SelectList(state, "CountryId", "StateName"), JsonRequestBehavior.AllowGet);
}
将解决您的问题,或者您可以使用显式参数名称调用此URL
本地主机:28636 /注册/注册/ StateList countryId = 1
修改2
评论后:
是的,但是有一个问题,它从数据库intead中获取状态,其中状态ID为1
我认为这是因为您正在过滤结果但未返回结果。而是返回DbSet
。您的GetAllStateByCountry
应该更像这样:
public IQueryable<State> GetAllStateByCountry(int Id)
{
return DbSet.Where(dto => dto.CountryId == Id)
.Include(dto => dto.Country);
}
答案 2 :(得分:0)
将控制器代码修改为:
public JsonResult StateList(int? countryId)
{
if (countryId != null && countryId.HasValue)
{
var state = _countryState.GetAllState(countryId.Value);
return Json(new SelectList(state, "CountryId", "StateName"), JsonRequestBehavior.AllowGet);
}
return Json(null);
}
通过执行此操作 - 您将允许countryID为空,并且如果它们为countryID传递空值,您将返回一个空的json。