2017-03-14 3 views
0

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> 
} 

Répondre

0

juste ne remplit pas les valeurs dataObj dans votre javascript à moins que les valeurs de champ de formulaire sont définies.

afin de mettre à jour la déclaration de dataObj à quelque chose comme:

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

devrait supprimer les paramètres de requête vide sur la requête GET.

+1

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. –

+0

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