Dans le suivant view
Je passe un objet (ViewModel) au contrôleur. Cela fonctionne bien si l'utilisateur entre toutes les valeurs dans le formulaire. L'échantillon URL demandée avec querystring
généré par requête LINQ est la suivante:Comment ignorer les valeurs vides lors du passage d'un ViewModel (objet) via Ajax à un contrôleur MVC
Request URL:http://localhost:50507/OrdCtrl/OrdAction?OrdYear=2016&OrderNumber=CE123&OrderName=testOrder&hasOrdered=true&_=1489509308855
Mais si les skips utilisateur d'entrer une valeur dans le formulaire de recherche, par exemple, orderName
l'utilisateur obtient l'erreur attendue:
NullReferenceException: Object reference not set to an instance of an object.
Je pense que l'erreur ci-dessus se produit depuis l'URL générée fait défaut la valeur de paramètre pour orderName
comme indiqué ci-dessous:
Request URL:http://localhost:50507/OrdCtrl/OrdAction?OrdYear=2016&OrderNumber=CE123&OrderName=&hasOrdered=true&_=1489509308855
Question: Dans l'appel Ajax dataObj
ci-dessous, comment pouvons-nous ignorer les paramètres d'entrée si leurs valeurs sont des chaînes vides - de sorte que la chaîne de requête générée n'inclut pas ces paramètres. NOTE: Ceci est un formulaire de recherche et les utilisateurs sont autorisés à effectuer une recherche uniquement en fonction des valeurs qu'ils saisissent dans le formulaire.
TestViewModel:
public class UsetListViewModel
{
public int OrdYear { get; set; }
public string OrderNumber { get; set; }
public string OrderName { get; set; }
public bool hasOrdered { get; set; }
}
Voir:
@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>
}
le contrôleur doit vérifier qu'il est capable de gérer des valeurs nulles pour un ou peut-être tous les divers paramètres de recherche. vous pourriez envisager d'utiliser la classe PredicateBuilder pour ajouter dynamiquement des critères à votre requête linq en fonction des valeurs effectivement envoyées au contrôleur. –
Votre solution fonctionne mais il y a eu un problème lorsque 'dataObj' a été envoyé au contrôleur avec, disons,' OrdNum' comme nul. La requête LINQ dans ce cas lançait une erreur bien connue: 'NullReferenceException'. Pour remédier à cela, j'ai dû utiliser 'qry = _context.Orders.Where (o => (string.IsNullOrEmpty (monModel.OrdNum) || p.OrdNum == myModel.OrdNum)'. Mais, pour être juste, vous avez répondu à ce que j'ai demandé (merci). – nam