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中加载列的控件取决于类的元数据。它读取类的数据类型,然后相应地加载控件。如果您对这些控件进行任何更改,将会影响其他地方。
顶部处理这应该创建新控件并在该控件中进行验证,并在该列的类中指定它应该使用您的自定义控件。
如果您需要更多关于如何自定义控件的详细信息,请告诉我们。