41 votes

Asp.Net MVC EditorTemplates / UIHint avec paramètres

J'ai été en utilisant l'éditeur de modèles dans le passé comme ceci:

[UIHint("DateTime")]

ViewModel

 public class MicroViewModel
 {
    public IEnumerable<Lab_Micro> Micros { get; set; }

    [UIHint("DateTime")]
    public DateTime Date { get; set; }

    public int CaseNo { get; set; }

    [UIHint("SampleTypes")]
    public int Labs_ST_ID { get; set; }

    [UIHint("SampleDetails")]
    public int Labs_SD_ID { get; set; }
 }

Exemple de modèle: [DateTime Éditeur de Template]

@model DateTime?    
@Html.TextBox("",  String.Format("{0:yyyy-MM-dd}", Model.HasValue ? 
        Model : DateTime.Today), new { @class = "dp", style="width:100px" })

<script type="text/javascript">    
    $(document).ready(function () {    
        $(".dp").datepicker({    
            changeMonth: true,    
            changeYear: true,
            dateFormat: 'yy-mm-dd'    
        });    
    });      
</script>  

Question

Comment pourrais-je aller sur le passage de paramètres à la UIHint vue partielle pour Labs_ST_ID & Labs_SD_ID, comme j'aimerai avoir une saisie semi-automatique EditorTemplate que vais prendre une URL, & les noms de propriété par exemple.

J'ai vu que je peux faire la chose suivante (toujours en cours d'étude/de recherche sur le web moi-même)

[UIHint("LabName", "HTML", new[] { "", "" })]

Ce que je pense de ma saisie semi-automatique EditorTemplate/Partielle devrait ressembler à

 $(".auto").autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: '[#URL_TO_USE]',
                        dataType: "json",
                        data: {
                            filter: request.term
                        },
                        success: function (data) {
                            response($.map(eval(data), function (item) {
                                return {
                                    label: item.[#PROPERTY_TO_USE]
                                }
                            }));
                        }
                    })
                }                    
            });

Je vais apprécier tous les liens/tut ou de l'info si quelqu'un l'a fait avant :)

merci d'avance

78voto

Darin Dimitrov Points 528142

Vous pouvez utiliser l'attribut AdditionalMetadata :

 [UIHint("DateTime")]
[AdditionalMetadata("foo", "bar")]
public DateTime Date { get; set; }
 

et dans le modèle:

 @ViewData.ModelMetadata.AdditionalValues["foo"]
 

donc si vous vouliez passer une URL:

 [UIHint("DateTime")]
[AdditionalMetadata("controller", "somecontroller")]
[AdditionalMetadata("action", "someaction")]
[AdditionalMetadata("property", "someproperty")]
public DateTime Date { get; set; }
 

et dans votre modèle:

 @{
    var values = ViewData.ModelMetadata.AdditionalValues;
}

<script type="text/javascript">
$('.auto').autocomplete({
    source: function (request, response) {
        $.ajax({
            url: '@Url.Action((string)values["action"], (string)values["controller"])',
            dataType: "json",
            data: {
                filter: request.term
            },
            success: function (data) {
                response(
                    $.map(eval(data), function (item) {
                        return {
                            label: item['@values["property"]']
                        }
                    })
                );
            }
        });
    }                    
});
</script>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X