ASP.NET MVC验证

问题描述:

我有2个场景,我需要一些帮助,在我的ASP.NET MVC应用程序重新验证。我知道在控制器内进行验证并不理想,所以我希望将其保存在其他地方 - 也许我可以在我的模型上进行验证。ASP.NET MVC验证

1)我有一个模型与各种属性,其中一些使用DataAnnotations对他们进行验证。然后,我使用我的视图中的Html帮助器方法在相关字段中公开任何验证错误。在大多数情况下,这些工作如预期。我遇到的例外情况是我的视图中的一个字段是下拉列表。我列表中的第一项是空的/空白的,其余是真正的值。这一领域涉及在我的模型的属性有以下反对:

[Required(ErrorMessage = "A value from the list is required")] 

目前,如果我离开的默认值列表(空白),并没有从列表中选择一个真正的价值,我希望它呈现验证错误消息,但它现在将它当作一个有效值处理,并传递该验证。

如果提交的空白/空列表项目被提交,我怎样才能使它失败验证?

2)在我的观点之一,我有几个文件上传控件,使用户能够上传图像到网站。这些字段不会直接绑定到我的模型中的任何属性 - 只有生成的文件名(一旦文件被上传,转换,重命名等)被分配到我的模型中的'Filename1','Filename2'等属性。

所以,我想知道如何最好地验证这些强制性文件上传?目前我做的每一个文件上传控件的下面,我的控制器内(!):

HttpPostedFileBase file = null; 

file = Request.Files["Filename1"]; 
     if (file != null && file.ContentLength == 0) 
       ModelState.AddModelError("Filename1", "Image1 is required"); 

一旦为每个文件上传控件完成的,我检查ModelState中是有效的:

if (ModelState.IsValid) 

我敢肯定,必须有执行此验证的一种更好的方式,和我想像这是不理想有这个控制器,但我不知道最好的方式来处理这个问题。

我很感谢这两种情况的任何帮助。

这里是我的代码(解释后):

形式:

<% using (Html.BeginForm("TestForm", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    { %> 
    <%: Html.DropDownList("ComboboxValue", new SelectList(Model.ComboboxValues)) %><br /> 
    <input type="file" id="FileUpload" name="FileUpload" /><br /> 
    <input type="submit" id="submit" name="submit" value="Valider" /> 
<%} %> 

型号:

public class TestFormModel 
{ 
    [Required(ErrorMessage = "A value from the list is required")] 
    public string ComboboxValue { get; set; } 

    public List<string> ComboboxValues { get; set; } 

    public HttpPostedFileBase FileUpload { get; set; } 

    public ModelStateDictionary IsFileValid() 
    { 
     ModelStateDictionary modelState = new ModelStateDictionary(); 
     modelState.AddModelError("FileUpload", "Here is the problem."); 
     return modelState; 
    } 

控制器:

public ActionResult TestForm() 
    { 
     TestFormModel model = new TestFormModel(); 
     model.ComboboxValues = new List<string>(){ 
      "", "Red", "Blue", "Yellow" 
     }; 
     return View("TestForm", model); 
    } 
    [HttpPost] 
    public ActionResult TestForm(TestFormModel model) 
    { 
     model.ComboboxValues = new List<string>(){ 
      "", "Red", "Blue", "Yellow" 
     }; 
     ModelState.Merge(model.IsFileValid()); 
     return View("TestForm", model); 
    } 

1)如果你有一个空值,你的模型不会是有效的。

2)为了避免Request.Files [ “FILENAME1”];你可以“键入”你的表单(new {enctype =“multipart/form-data”})。 有了这个,你的模型将包含该文件。 您可以添加一个扩展方法,例如:

public static bool IsCSVValid(this HttpPostedFileBase file) 
{ 
    return (file != null && file.ContentLength != 0 && file.FileName.EndsWith(".CSV", StringComparison.InvariantCultureIgnoreCase)); 
} 

而且你可以从某处ModelState.Merge添加错误()。

我不知道它是否是一个“做一件好事”,但它工作得很好:)

对于#1,下拉列表中发布的值是多少?以及您试图绑定的模型中的类型是什么?如果它发布了一个像“”的值,那么它将通过验证。如果你的类型是一个字符串,你需要确保它是一个空字符串。

对于#2,您可以尝试编写自定义模型联编程序,但不知道如何访问这些文件会有多丑。另一种选择是让它在行动结果的参数的一部分:

public ActionResult Test(TestModel model, HttpPostedFileBase files) 

这至少会做自动文件是否存在对您具有约束力,但你仍然要执行手动验证,就像您做之前。我知道它不是你正在寻找的确切答案,但它确实清理了更多的文件代码。

而且,这个问题可能会帮助更多一点:ASP.NET MVC posted file model binding when parameter is Model

见不着就像你在ASP.net动态数据的工作。如果是的话,ASP.Net动态数据在模块视图控制的概念上工作。

在MVC中加载列的控件取决于类的元数据。它读取类的数据类型,然后相应地加载控件。如果您对这些控件进行任何更改,将会影响其他地方。

顶部处理这应该创建新控件并在该控件中进行验证,并在该列的类中指定它应该使用您的自定义控件。

如果您需要更多关于如何自定义控件的详细信息,请告诉我们。