2017-03-14 24 views
0

viewで、オブジェクト(ViewModel)をコントローラに渡します。ユーザーがフォームのすべての値を入力するとうまく動作します。サンプルは以下のとおりであるLINQクエリを介して生成querystringにURLを要求:ViewModel(オブジェクト)をAjax経由でMVCコントローラに渡すときに空の値を無視する方法

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. 

私は、以下のように生成された要求されたURLがorderNameのパラメータ値が欠落しているので、上記のエラーが発生したと思う:

Request URL:http://localhost:50507/OrdCtrl/OrdAction?OrdYear=2016&OrderNumber=CE123&OrderName=&hasOrdered=true&_=1489509308855 

質問:下記のAjaxコール内のdataObjでは、値が空の文字列の場合は入力パラメータをスキップすることができます - 生成されたクエリー文字列にはこれらのパラメータは含まれません。 注::これは検索フォームであり、ユーザーはフォーム内に入力した値のみに基づいて検索することができます。

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

は自分のJavaScriptでdataObjの値を移入しないでください。 GET要求に空のクエリパラメータを削除する必要があり

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

はそうのようなものにdataObjの宣言を更新します。

+1

コントローラーは、さまざまな検索パラメーターのうちの1つまたはすべてにnull値を処理できるかどうかをチェックする必要があります。 PredicateBuilderクラスを使用して、実際にコントローラに送信される値に応じてlinqクエリに条件を動的に追加することを検討することもできます。 –

+0

あなたの解決策は動作しますが、例えば 'OrdNum'をnullとして' dataObj'がコントローラに送られたときに問題がありました。その場合のLINQクエリは、よく知られているエラー「NullReferenceException」を投げていました。私が 'qry = _context.Orders.Where(o =>(string.IsNullOrEmpty(myModel.OrdNum)|| p.OrdNum == myModel.OrdNum)'を使用しなければならなかったことを改善するために、私が尋ねたもの(ありがとう)。 – nam

関連する問題