如何通过Ajax将ViewModel(对象)传递给MVC控制器时忽略空值

时间:2017-03-14 18:56:17

标签: c# asp.net-core asp.net-ajax asp.net-core-mvc

在下面的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>
}

1 个答案:

答案 0 :(得分:0)

除非设置了表单字段值,否则不要在javascript中填充dataObj中的值。

所以将dataObj的声明更新为:

var dataObj = {};
if ($('#yearID').val() !== '') {
    dataObj.OrdYear = $('#yearID').val();
}
if ($('#OrdNumb').val() !== '') {
    dataObj.OrderNumber = $('#OrdNumb').val();
}
... etc ...

应删除GET请求中的空查询参数。