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>
}
コントローラーは、さまざまな検索パラメーターのうちの1つまたはすべてにnull値を処理できるかどうかをチェックする必要があります。 PredicateBuilderクラスを使用して、実際にコントローラに送信される値に応じてlinqクエリに条件を動的に追加することを検討することもできます。 –
あなたの解決策は動作しますが、例えば 'OrdNum'をnullとして' dataObj'がコントローラに送られたときに問題がありました。その場合のLINQクエリは、よく知られているエラー「NullReferenceException」を投げていました。私が 'qry = _context.Orders.Where(o =>(string.IsNullOrEmpty(myModel.OrdNum)|| p.OrdNum == myModel.OrdNum)'を使用しなければならなかったことを改善するために、私が尋ねたもの(ありがとう)。 – nam