【发布时间】:2018-05-25 04:34:04
【问题描述】:
视图显示一秒钟,然后引发以下错误-
参数字典包含方法“System.Threading.Tasks.Task1[System.Web.Mvc.ActionResult] Details(Project.Enumerators.SortResultEnum, System.Web.Helpers.SortDirection, System.String, System.Nullable1[System.Int32]”的不可空类型“Project.Enumerators.SortResultEnum”的参数“sortField”的空条目) '在'Project.Controllers.SearchController'中。可选参数必须是引用类型、可空类型或声明为可选参数。
参数名称:参数
我有一个表单正在进行 ajax 调用,后来 ajax 调用将其转发给控制器。
Ajax 调用:
$(document).on('submit', '#SearchForm', function () {
var $form = $(this);
var $searchString = $("#SearchString").val();
var $sortField = $form.attr("data-sortOrder");
var $sortDirection = $form.attr("data-sortDirection");
SortResults($sortField, $sortDirection, $searchString);
});
表格:
<form id="SearchForm" action="@Url.Action("Details", "Search")" method="get" data-ajax="true" data-sortOrder="@SortResultEnum.ClientName" data-sortDirection="@SortDirection.Ascending">
@Html.TextBox("SearchString", ViewBag.CurrentSearchString as string, new { id = "SearchString", @class = "form-control", placeholder = "" })
<span class="input-group-btn">
<button class="btn btn-primary" type="submit" id="search-btn"><i class="glyphicon glyphicon-search"></i></button>
</span>
</form>
控制器动作就像
public async Task<ActionResult> Details(SortResultEnum sortField,SortDirection sortDirection, string searchString, int? page)
{
//code to call service and get result is here
// partial view is being used to display data
}
谁能帮我解决这个错误。谢谢。
【问题讨论】:
-
错误消息告诉您您的操作没有收到 tis
sortField参数的值。调试您的代码以了解原因。大概$form.attr("data-sortOrder")不会产生有效值。如果是这样,那么该值一定在某处丢失了。调试以找出位置。顺便说一句,你为什么要在变量前加上$? -
您将枚举值传递给控制器
sortField,而不是完整的枚举。您必须将SortResultEnum sortField替换为string sortField。您的控制器操作方法应具有以下参数public async Task<ActionResult> Details(string sortField, string sortDirection, string searchString, int? page) -
@mmushtaq,这是不正确的。该参数应该接收
SortResultEnum类型的值,因此应该将其声明为该类型。问题是没有传递这样的值。 -
$form.attr("data-sortOrder") 中收到了正确的值。我的表单出现一秒钟然后丢失并出现错误。我已经检查过在 PartialView 中传递的模型是否具有所有正确的值
-
@jmcilhinney 我想知道 OP 如何将
Enum类型参数传递给控制器。正如以下SO thread 所建议的,枚举值应作为int或string传递,并将这些值转换为控制器中的枚举类型。