2017-07-14 59 views
0

我試圖驗證使用輸入提前的幾個用戶輸入字段。我想拒絕任何不包含在提前輸入列表中的輸入。如何修復錯誤:參數1:無法從'字符串'轉換爲'Name.Entity.Models.MakeModelInfo

但我對代碼的 'VAR的isValid' 線得到一個編譯錯誤,當我嘗試運行我的應用程序:

我的視圖模型

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

我的控制器

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

GetActiveMakeModelInfo()的返回類型在這裏:

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

MakeModelInfo的字符串表示:

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

據當時https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/introduction/adding-validation Microsoft文檔這應該工作。

我在.Net很新,我不知道如何解決這個問題。任何人都可以提供建議嗎?

+2

什麼是GetActiveMakeModelInfo的返回類型?它似乎沒有返回字符串的集合,而是一組makemodelinfo –

+0

我使用返回類型編輯了我的問題。請原諒我缺乏經驗,但我可以用一些幫助來理解爲什麼會影響我的問題。謝謝。 – csharpMind

+1

好吧,您正在比較'MakeModelInfo'和'string',這是行不通的。如何解決它?蘋果和梨比較蘋果梨:) – oerkelens

回答

1

我猜你真的想檢查的是,如果用戶輸入(字符串)存在於MakeModelInfo的「Allowed」列表中。你已經知道你不能將一個對象與一個字符串進行比較,所以Contains方法將不起作用。你可以做的是這樣的:

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

如果你只是有興趣檢查其中一個屬性而不是兩個都可以修改。或者,您可能想要做的是使用一個下拉列表,其中包含您車輛列表中的車輛製造商和另一個包含所選車型的車型。 Here就是一個例子。

+0

我終於得到它的工作基礎上,我從你的帖子馬特得到的信息。感謝你的協助。 – csharpMind

0

在這條線:

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

您在這裏缺少了這一點。 Contains()方法有不同的重載函數。您正在使用ICollection<T>.Contains(T),這意味着列表的類型和參數的類型相同。因此,在上面的代碼中,編譯器認爲userInput具有相同的類型,即MakeModelInfo

您應該使用ICollection<T>.Contains(Predicate(T)),它需要lambda表達式,並且您可以檢查屬性值。例如

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

如果allowedList含有屬性Make or Model等於userInput任何項目,它將返回true or false

相關問題