Удаленная проверка asp.net mvc

Я новичок в mvc, так что простите меня, если вопрос глупый, но я хочу сделать все, что в моих силах. Итак, моя ситуация такова: я создал модель и украсил ее, как

Partial Public Class App_Modules

    <Required>
    <Remote("CheckForDuplicate", "Validation")>
    <Display(Name:="Code")>
    Public Property code As String

    <Required>
    <Display(Name:="Description")>
    Public Property name As String


End Class

Как видите, столбец кода должен пройти удаленную проверку. В моем ValidationController у меня есть код

     Public Function CheckForDuplicate(code As String) As JsonResult
         Dim data = db.App_Modules.Where(Function(p) p.code.Equals(code, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()

         If data IsNot Nothing Then
             Return Json("This code already exists",JsonRequestBehavior.AllowGet)
         Else
             Return Json(True, JsonRequestBehavior.AllowGet)
         End If
     End Function
 End Class

Все работает нормально! Теперь я хочу сделать то же самое для другой модели с тем же полем «код». Есть ли способ передать имя модели в функцию, чтобы вместо строки

 Dim data = db.**App_Modules**.Where(Function(p) p.code.Equals(code, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()

Я мог бы иметь что-то вроде

Dim data = db.**TABLENAME**.Where(Function(p) p.code.Equals(code,  StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()

Таким образом, функция будет общей и может быть вызвана и из других моделей?


person Makis    schedule 09.12.2014    source источник


Ответы (2)


Я не уверен в синтаксисе в VB, но вы можете изменить свою функцию CheckForDuplicate, чтобы принять общий параметр, который представляет ваш класс модели, и передать его функции Set вашего DBContext. вам также потребуется определить интерфейс для вашей модели, который содержит свойство Code. Пример кода на С# выглядит следующим образом.

public JsonResult CheckForDuplicate<T>(string code) where T : IModelWithCode
{
    var data = db.Set<T>().Where(t => t.Code.Equals(code));
    ....
}

public interface IModelWithCode
{
    string Code { get; set; }
}

Надеюсь, это поможет вам начать в правильном направлении.

person mreyeros    schedule 09.12.2014

Я не думаю, что это можно сделать или, по крайней мере, легко.

Я бы придерживался здесь простого: создайте Select Case и проверьте таблицы в зависимости от переданного параметра (название модели).

Dim exist = false;

Select Case myModel
        Case "Model1"
            exist = db.Model1Table.Where(Function(p) p.code.Equals(code, StringComparison.CurrentCultureIgnoreCase)).Any()
        Case "Model2"
            exist = db.Model2Table.Where(Function(p) p.code.Equals(code, StringComparison.CurrentCultureIgnoreCase)).Any()
End Select

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

ОБНОВЛЕНИЕ: здесь вы можете увидеть статью, показывающую, как передать другие поля в действие валидатора. Вы должны создать скрытое поле для хранения имени модели. http://www.codeproject.com/Articles/674288/Remote-Validation-in-MVC-Simple-Way-to-Pass-the-F

Другой ресурс: Дополнительные поля MVC Remote Attribute

person Romias    schedule 09.12.2014
comment
Хм! Но как имя модели Model1 или Model2 передается в функцию контроллера? - person Makis; 09.12.2014