2017-10-20 35 views
2

Condition: Je suis supposé développer un widget de recherche qui devrait générer les contrôles de kendo en fonction des propriétés du modèle passées au cshtml.Comment générer les contrôles UI Kendo dynamiquement en fonction des propriétés du modèle transmises du contrôleur à cshtml

Par exemple: Si le modèle contient les propriétés suivantes telles que

public string Name {get; set;} 

alors il devrait générer la zone de texte comme témoin, ou si la propriété est

public string DateOfBirth {get; set;} 

alors il devrait générer un DatePicker . Ce que j'ai pu réaliser est de passer le modèle dynamiquement au cshtml afin que le cshtml soit faiblement couplé. Le problème auquel je suis confronté est que le modèle qui est passé a des propriétés de différents types de données mais dans le cshtml sont générés uniquement avec des contrôles de zone de texte pour toutes les propriétés, ce qui signifie qu'il prend le type de données pour toutes les propriétés du modèle.

S'il vous plaît vérifier le code ci-dessous: Controller:

[HttpGet] 
    public ActionResult About(AddressModel obj) 
    { 
       dynamic model = obj; 
       return this.View(model); 
    } 

cshtml:

@inherits BaseRazorView<object> 
  
<h1>Search Criteria</h1> 
  
@for (int i = 0; i < Model.GetType().GetProperties().Count(); i++) 
{ 
    <div class="row col-md-5"> 
        @Html.EditorFor(model => model.GetType().GetProperties()[i].Name) 
    </div> 
    <br /> 
} 
+0

Comment il différent du type des champs si un champ de date est une chaîne? – DontVoteMeDown

Répondre

2

Vous pouvez obtenir le type de propriété de la propriété par le PropertyInfo et probablement utiliser pour différencier le type du contrôle d'entrée que vous utiliserez.

https://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.propertytype(v=vs.110).aspx

Par exemple

@for (int i = 0; i < Model.GetType().GetProperties().Count(); i++) 
{ 
    if(Model.GetProperties[i].PropertyType.Name == "String"){ 
     // add an editor or a textbox 
    } 
    else if(Model.GetProperties[i].PropertyType.Name == "DateTime"){ 
     // add a datetime picker 
    } 
}