JSON返回Params错误

时间:2014-08-08 11:43:30

标签: c# asp.net asp.net-mvc json repository-pattern

我想获取所有状态使用状态表中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();
    }

3 个答案:

答案 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。