2017-04-27 1 views
0

J'ai implémenté la fonction combo kendo avec fonctionnalité en cascade dans mon application MVC 5. J'essaye d'implémenter le filtrage de serveur et ai frappé un bloc de route.Problème technique avec le filtre du serveur combo Kendo

La zone de liste déroulante affiche le numéro de client et le nom concaténé en tant que texte d'affichage. J'essaie d'implémenter le filtrage lorsque l'utilisateur tape quelques caractères. J'ai techniquement deux problèmes ici. Le premier est de savoir comment transmettre le texte du filtre au contrôleur. J'ai écrit une fonction javascript pour renvoyer le texte filtré, mais j'ai déjà défini l'attribut data sur une autre fonction appelée GetSalesOfficeFilter. Le deuxième problème que j'ai est que le filtre est sur le champ concaténé Name1 et Customer Number de mon modèle de vue alors que la requête linq que j'ai écrite n'a accès qu'au modèle qui ne contient pas le champ concaténé. Comment puis-je obtenir ce travail?

<div class="form-group"> 
        @Html.LabelFor(model => model.Name1, htmlAttributes: new { @class = "control-label col-md-4" }) 

        <div class="col-md-8"> 
         <div class="editor-field"> 
          @(Html.Kendo().ComboBoxFor(model => model.CustomerMasterDataId) 

        .HtmlAttributes(new { style = "width:100%" }) 
        .DataTextField("CustomerNumberName") 
        .Placeholder("Select...") 
        .DataValueField("CustomerMasterDataId") 
        .Filter("contains") 
        .MinLength(3) 
        .DataSource(dataSource => dataSource 
          .Read(read => 
          { 
           read.Action("RequestHeader_CustomerData", "Request") 
            .Type(HttpVerbs.Post) 
            .Data("GetSalesOfficeFilter"); 
          }).ServerFiltering(true) 
            ).CascadeFrom("CountryCode").Filter("contains") 

         .Events(e => 
         { 
          e.Change("onCustomerComboChange"); 
         }) 
          ) 
         </div> 
         @Html.ValidationMessageFor(model => model.Name1, "", new { @class = "text-danger" }) 
        </div> 
       </div> 

Contrôleur

public ActionResult RequestHeader_CustomerData(string id,string filter) 
     { 
      var response = requestRepository.GetCustomerData(id).AsQueryable().Where(i => i.Name1.Contains(filter)).ProjectTo<CustomerViewModel>(); 

      var jsonResult = Json(response, JsonRequestBehavior.AllowGet); 
      jsonResult.MaxJsonLength = int.MaxValue; 
      return jsonResult; 
     } 

javascript

function GetSalesOfficeFilter() { 

    return { id: $('#CountryCode').val() } 
}; 


function onAdditionalData() { 
     return { 
      filter: $("#Name1").data("kendoComboBox").text() 
     }; 
    } 

Répondre

0

Vous devez utiliser Kendo Dinamic Linq bibliothèque pour le filtrage du serveur. Mais pour un travail correct, vous ne pouvez pas utiliser des mappeurs ou quelque chose qui peut matérialiser votre requête.

Voici exemple de comment vous pouvez le faire kendo sens:

using Kendo.DynamicLinq; 

public class EmployeesController : Controller { 

    [HttpPost] 
    public ActionResult Get(int take, int skip, IEnumerable<Kendo.DynamicLinq.Sort> sort, Kendo.DynamicLinq.Filter filter) { 
    var employees = _context.Employees.OrderBy(e => e.Employee_ID) 
     .OrderBy(e => e.Employee_ID) 
     .Select(e => new Models.Employee { 
     EmployeeID = e.Employee_ID, 
     FirstName = e.First_Name, 
     LastName = e.Last_Name, 
     Title = e.Title, 
     BirthDate = e.Birth_Date 
    }); 

    return Json(employees.ToDataSourceResult(take, skip, sort, filter)); 
    } 
} 

Découvrez docs

Mais si vous ne pouvez ou ne pas utiliser de nouvelles bibliothèques, il y a une autre façon. Avant d'envoyer une requête au serveur, vous pouvez analyser les filtres au parametrMap function sur le client et envoyer un seul paramètre que vous gérerez sur le serveur.