当我将参数值传递为null时,为什么我得到“参数字典包含参数x的空条目”?

时间:2012-07-09 05:50:50

标签: asp.net-mvc-3

我有一个像这样的Action方法

[HttpPost]
public ActionResult DoSearchRequestOperation(SearchRequestModelDto data)
{
     //..
}

当我使用此网址字符串http://localhost:9124/Search/SearchRequest?searchRequestFor=0时,它可以正常工作。但是当我使用网址http://localhost:9124/Search/SearchRequest?searchRequestFor=时,它会抛出此异常

  

System.ArgumentException:参数字典包含null   非可空类型的参数'searchRequestFor'的条目   'xxxx.Shared.Dto.Process.Search.SearchRequestFor'用于方法   “System.Web.Mvc.ActionResult   SearchRequest(xxxx.Shared.Dto.Process.Search.SearchRequestFor)'in   “xxxx.WebServer.UI.Controllers.SearchController

如果用户提供第二个网址,则应该取值0.

我尝试更改maproute,如下所示,但这也无效。

  routes.MapRoute(
            "Default1", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Dashboard", id = 0 } 
        );

这是SearchRequestModelDto类

[DataContract]
public class SearchRequestModelDto : UIBoundDto
{
    public SearchRequestModelDto()
    {
        Criteria = new SearchRequestCriteriaDto();
        SearchResult = new SearchRequestResultDto();
    }

    [DataMember]
    public SearchRequestCriteriaDto Criteria { get; set; }

    [DataMember]
    public SearchRequestResultDto SearchResult { get; set; }
}

2 个答案:

答案 0 :(得分:0)

这是因为SearchRequestFor类型应该是可以为空的

public ActionResult SearchRequest(SearchRequestFor? searchRequestFor)
{
    //...
}

答案 1 :(得分:-1)

如果您希望能够在查询字符串中发送空值,则可以使SearchRequestFor视图模型上的SearchRequestModelDto属性成为可以为空的整数:

public int? SearchRequestFor { get; set; }

您在路由中设置id=0这一事实对查询字符串参数没有影响。它们不受路由控制,因此您必须编写自定义模型绑定器或在模型上使用可为空的整数。后者是首选。