2011-01-06 4 views
2

У меня есть 2 сценария, в которых мне нужна помощь с повторной проверкой в ​​моем приложении ASP.NET MVC. Я знаю, что проверка в контроллере не идеальна, поэтому я хочу сохранить это в другом месте - возможно, с моими моделями, где я могу.ASP.NET MVC Validation

1) У меня есть модель с различными свойствами, некоторые из которых имеют валидацию против них с использованием DataAnnotations. Затем я использую методы html helper в моем представлении, чтобы выявить любые ошибки проверки относительно соответствующих полей. По большей части, они работают, как ожидалось. Исключением, с которым я столкнулся, является то, что одно из полей в моем представлении - это раскрывающийся список. Первый элемент в моем списке пуст/пуст, остальные - подлинные значения. Свойство в моей модели, которая связывает это поле имеет следующий против него:

[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) 

Я уверен, что должен быть лучший способ выполнения этой проверки, и я предположил бы, что это не идеально, чтобы иметь это в контроллере, но я не уверен, что лучший способ справиться с этим.

Буду признателен за любую помощь в этих двух сценариях.

ответ

0

Вот мой код (объяснения позже):

Форма:

<% 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"]; вы можете «набрать» свою форму (новый {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().

я не знаю, если это «хорошая вещь, чтобы сделать», но он работает довольно хорошо :)

0

За # 1, какое значение публикуется для раскрывающегося списка и каков тип вашей модели, с которой он пытается связать? Если он отправляет значение типа «», он будет проходить проверку. Вы должны убедиться, что это пустая строка, если ваш тип является строкой.

Для # 2 вы можете попробовать написать настраиваемое связующее устройство, но не знаете, насколько уродливым будет доступ к файлам. Другим вариантом является, чтобы сделать его частью ваших параметров на результат действия:

public ActionResult Test(TestModel model, HttpPostedFileBase files) 

Это будет по крайней мере, сделать автоматическое связывание для вас, если файл существует, но вы все равно придется выполнять ручную проверку, как вы бы делаю раньше. Я знаю, что это не точный ответ, который вы ищете, но он немного очищает код файла.

Кроме того, этот вопрос может помочь немного больше: ASP.NET MVC posted file model binding when parameter is Model

0

Это шов, как вы работаете с данными ASP.net Dynamic. Если да, динамические данные ASP.Net работают над концепцией управления представлением модуля.

В MVC Загрузка элемента управления для столбца зависит от метаданных класса. Он считывает тип данных класса и затем соответствующим образом управляет загрузкой. Если вы внесете какие-либо изменения в этот элемент управления, это повлияет и на другие места.

Для этого нужно создать новый элемент управления и выполнить проверку в этом элементе управления и в классе для этого столбца, вы можете указать, что он должен использовать ваш настраиваемый элемент управления.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация о том, как настроить управление.