2017-07-14 1 views
0

Ich versuche, mehrere Benutzer Eingabefelder zu validieren, die Typ-Ahead verwenden. Ich möchte alle Eingaben ablehnen, die nicht in der Schnelladressliste enthalten sind.Wie behebe ich den Fehler: Argument 1: Kann nicht von "String" in "Name.Entity.Models.MakeModelInfo" konvertieren

Aber ich bin immer ein Build-Fehler auf dem 'var isValid' Codezeile, wenn ich versuche, meine Anwendung auszuführen:

Mein Ansichtsmodell

[Required] 
    [StringLength(100)] 
    [AllowedModelMake(ErrorMessage = "Please enter a Make from the list.")] //JosephW 
    public string Make { get; set; } 
    public string MakePlaceholder { get; set; } 

    [Required] 
    [StringLength(100)] 
    [AllowedModelMake(ErrorMessage = "Please enter a Model from the list.")] //JosephW 
    public string Model { get; set; } 
    public string ModelPlaceholder { get; set; } 

mein Controller

public class AllowedModelMakeAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     // Validate that user input is in the list of allowed values 
     var allowedList = MakeModelHelpers.GetActiveMakeModelInfo(); 

     var userInput = value as string; 

     var isValid = allowedList.Contains(userInput); //<- ERROR IS HERE 

     return isValid; 
    } 
} 

Der Rückgabetyp für GetActiveMakeModelInfo() ist hier:

public static List<MakeModelInfo> GetActiveMakeModelInfo() { 
    return makeModelRepository.GetActiveInfo(); 

Die Stringdarstellung von MakeModelInfo ist:

namespace Name.Entity.Models { 
    public class MakeModelInfo { 
     public int Id { get; set; } 
     public string Make { get; set; } 
     public string Model { get; set; } 
    } 
} 

Laut der Microsoft-Dokumentation unter https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/introduction/adding-validation dies funktionieren sollte.

Ich bin ziemlich neu bei. Net und ich bin mir nicht sicher, wie Sie dieses Problem beheben. Kann mir jemand einen Vorschlag machen?

+2

Was ist der Rückgabetyp von GetActiveMakeModelInfo? Es scheint, dass es nicht eine Sammlung von Zeichenfolgen zurückgibt, sondern eine Sammlung von Makemodelinfo –

+0

Ich bearbeitet meine Fragen mit dem Rückgabetyp. Bitte vergib mir meinen Mangel an Erfahrung, aber ich könnte Hilfe gebrauchen, um zu verstehen, warum das mein Problem beeinflusst. Vielen Dank. – csharpMind

+1

Nun, Sie vergleichen 'MakeModelInfo' mit einer' Zeichenfolge', die nicht funktioniert. Wie man es repariert?Vergleichen Sie Äpfel mit Äpfeln und Birnen zu Birnen :) – oerkelens

Antwort

1

Ich rate, was Sie wirklich überprüfen möchten, ist, ob die Benutzereingabe (eine Zeichenfolge) in der Liste "Erlaubt" von MakeModelInfo vorhanden ist. Sie wissen bereits, dass Sie ein Objekt nicht mit einem String vergleichen können, daher funktioniert die Contains-Methode nicht. Was Sie tun können, ist so etwas wie dieses:

public override bool IsValid(object value) 
{ 
    // Validate that user input is in the list of allowed values 
    var allowedList = MakeModelHelpers.GetActiveMakeModelInfo(); 

    var userInput = value as string; 

    var isValid = allowedList.Any(i -> i.Make == userInput || i.Model == userInput); 

    return isValid; 
} 

Sie können dies ändern, wenn Sie bei der Prüfung eine der Eigenschaften nur interessiert sind und nicht beide. Alternativ können Sie ein Dropdown-Feld verwenden, das die Marken des Fahrzeugs enthält, das sich in Ihrer Liste befindet, und ein anderes, das die Modelle für das ausgewählte Make enthält. Here ist ein Beispiel.

+0

Ich habe es schließlich funktioniert basierend auf den Informationen, die ich von Ihrem Post Matt bekommen habe. Danke für deine Hilfe. – csharpMind

0

auf dieser Linie:

var isValid = allowedList.Contains(userInput); //<- ERROR IS HERE 

Sie sind hier fehlt der Punkt. Contains() Methode hat verschiedene Überladungsfunktionen. Sie verwenden ICollection<T>.Contains(T), was bedeutet, dass der Listentyp und der Argumenttyp identisch sind. Im obigen Code denkt der Compiler also, userInput habe den gleichen Typ, d. H. MakeModelInfo.

Sie sollten ICollection<T>.Contains(Predicate(T)) verwenden, es dauert Lambda-Ausdruck und in dem Sie nach dem Wert der Eigenschaft überprüfen können. z.B.

var isValid = allowedList.Contains(x=> x.Make.Equals(userInput)); 
//OR 
var isValid = allowedList.Contains(x=> x.Model.Equals(userInput)); 

Wenn die allowedList ein beliebiges Element enthält Eigenschaft Make or Model gleich userInput, wird er zurückkehren true or false

Verwandte Themen