ASP.NET 核心 MVC 验证从文件读取的对象列表

ASP.NET Core MVC validate list of objects read from file

这是在 ASP.NET 核心 MVC 2.1 中。

所以我想做的是验证我从文件中读取的对象列表。

控制器成功读取文件并获取数据。我正在使用模型的 DTO 版本,听说这样做更好。

主要实体模型。

public class Person
{
    [Key]
    public int ID { get; set; }

    [Required(ErrorMessage = "Osoba obavezno mora imati ime")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Osoba obavezno mora imati prezime")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Grad obavezno mora imati ime")]
    public string CityName { get; set; }

    [Required(ErrorMessage = "Osoba obavezno mora imati postanski broj")]
    [StringLength(5, MinimumLength = 5, ErrorMessage = "Poštanski broja mora sadrži točno 5 znamenki.")]
    [RegularExpression("^[0-9]*$", ErrorMessage = "Poštanski broj smije sadržavati samo znamenke.")]
    public string PostalCode { get; set; }

    [Required(ErrorMessage = "Osoba obavezno mora imati mobilni broj")]
    [StringLength(11, MinimumLength = 11, ErrorMessage = "Mobilni broja mora sadrži točno 11 znamenki.")]
    [RegularExpression("^[0-9]*$", ErrorMessage = "Mobilni broj smije sadržavati samo znamenke.")]
    public string MobileNumber { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}

DTO 实体模型。

public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string CityName { get; set; }
    public string PostalCode { get; set; }
    public string MobileNumber { get; set; }
}

控制器中使用的方法。

public IActionResult LoadData()
{
    PeopleService peopleService = new PeopleService();
    var path = "pathToFile";

    var resultData = peopleService.ReadCSVFile(path);
    return PartialView("_LoadDataTable", resultData);
}

所以现在我的问题是验证文件数据的最佳方法是什么?

我尝试使用它有效的实体模型,但我似乎不是个好主意,因为您每次都必须调用数据库。我想我想先在客户端验证它。 另外,我需要取回错误消息,以便在视图中显示它。

您可以使用 TryValidateModel 来验证文件中的对象。 Document

您需要先将字符串转换为特定的对象,然后调用TryValidateModel

public IActionResult LoadData()
    {
        
        //read the content from file and convert it to Person
        string readText = "";
        FileStream fileStream = new FileStream(@"path", FileMode.Open);
        using (StreamReader reader = new StreamReader(fileStream))
        {
            readText += reader.ReadToEnd();
        }
        var person = JsonConvert.DeserializeObject<Person>(readText);
        
        var valid=TryValidateModel(person);

        List<string> listError = new List<string>();
        foreach(var value in ModelState.Values)
        {
                if (value.Errors.Count > 0)
                    listError.Add(value.Errors[0].ErrorMessage);
        }
        
        ViewBag.errors = listError;
        //...
    }

查看

@foreach(var e in (List<string>)ViewBag.errors)
{
<span class="text-danger">@e</span>
}

另一种方法是在视图中使用 ValidationSummary

@Html.ValidationSummary()