在下面的view
中,我将一个Object(ViewModel)传递给控制器。如果用户输入表单中的所有值,它工作正常。通过LINQ查询生成的querystring
示例请求的URL如下:
Request URL:http://localhost:50507/OrdCtrl/OrdAction?OrdYear=2016&OrderNumber=CE123&OrderName=testOrder&hasOrdered=true&_=1489509308855
但是,如果用户跳过在搜索表单中输入一个值,比如orderName
,则用户会收到预期的错误:
NullReferenceException: Object reference not set to an instance of an object.
我认为发生上述错误,因为生成的请求网址缺少orderName
的参数值,如下所示:
Request URL:http://localhost:50507/OrdCtrl/OrdAction?OrdYear=2016&OrderNumber=CE123&OrderName=&hasOrdered=true&_=1489509308855
问题:在下面的dataObj
内部Ajax调用中,如果输入参数的值为空字符串,我们如何跳过输入参数 - 因此生成的查询字符串不包含这些参数。 注意:这是一个搜索表单,用户只能根据他们在表单中输入的值进行搜索。
TestViewModel:
public class UsetListViewModel
{
public int OrdYear { get; set; }
public string OrderNumber { get; set; }
public string OrderName { get; set; }
public bool hasOrdered { get; set; }
}
查看:
@model TestProj.Models.TestViewModel
....<!--Some html here-->
<div>
<form asp-controller="OrdCtrl" asp-action="OrdAction" method="get">
<input type="hidden" asp-for="OrdID" />
<div ><button type="button" id="SearchBtn">Search</button></div>
</form>
</div>
<div id="searchResults"></div>
@section scripts
{
<script>
$(document).ready(function () {
$('#SearchView').on('click', '#SearchBtn', function (event) {
var dataObj = {
OrdYear: $('#yearID').val(),
OrderNumber: $('#OrdNumb').val(),
OrderName: $('#OrdName').val(),
hasOrdered : $('[name=hasOrd]:checked').val()
}
$.ajax({
url: '@Url.Action("OrdAction", "OrdCtrl")',
data: dataObj,
contentType: 'application/json',
dataType: 'html',
type: 'GET',
cache: false,
success: function (data) {
$('#searchResults').html(data);
},
error: function (jqXHR, textStatus) {
alert('jqXHR.statusCode');
}
});
});
});
</script>
}
答案 0 :(得分:0)
除非设置了表单字段值,否则不要在javascript中填充dataObj中的值。
所以将dataObj的声明更新为:
var dataObj = {};
if ($('#yearID').val() !== '') {
dataObj.OrdYear = $('#yearID').val();
}
if ($('#OrdNumb').val() !== '') {
dataObj.OrderNumber = $('#OrdNumb').val();
}
... etc ...
应删除GET请求中的空查询参数。