이 질문은 this question의 결과입니다.Ninject가 ASP.NET MVC의 사용자 정의 유효성 확인 속성에서 작동하지 않습니다
ASP.NET MVC 웹 응용 프로그램을 개발 중입니다. 내 프로젝트에서 내 뷰 모델 클래스에 데이터 주석을 사용하여 원격 유효성 검사를 수행하고 있습니다. 기본 원격 특성이 서버 유효성 검사를 지원하지 않는다는 것을 알고 있습니다. 액션 메소드에서 다시 유효성을 검사 할 수 있습니다. 그러나 나는 그것이 우려의 분리를 위반하고 있다고하고 싶지 않습니다.
그래서 사용자 지정 서버 클라이언트 원격 유효성 검사 특성을 만들려고했습니다. 온라인에서 코드를 발견하고 사용했습니다. 그러나 서버 유효성 검사가 발생하면 오류가 발생합니다. 의존성 주입을 위해 Ninject를 사용하고 있습니다. Ninject가 유효성 검사 속성에 종속성을 주입 할 수 없기 때문에 오류가 발생했습니다. 아래의 시나리오를 참조하십시오.
이 내 사용자 지정 원격 유효성 검사 속성입니다 :
public class RemoteClientServerAttribute : RemoteAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// Get the controller using reflection
Type controller = Assembly.GetExecutingAssembly().GetTypes()
.FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller",
this.RouteData["controller"].ToString()).ToLower());
if (controller != null)
{
// Get the action method that has validation logic
MethodInfo action = controller.GetMethods()
.FirstOrDefault(method => method.Name.ToLower() ==
this.RouteData["action"].ToString().ToLower());
if (action != null)
{
// Create an instance of the controller class
object instance = Activator.CreateInstance(controller);
// Invoke the action method that has validation logic
object response = action.Invoke(instance, new object[] { value });
if (response is JsonResult)
{
object jsonData = ((JsonResult)response).Data;
if (jsonData is bool)
{
return (bool)jsonData ? ValidationResult.Success :
new ValidationResult(this.ErrorMessage);
}
}
}
}
return ValidationResult.Success;
// If you want the validation to fail, create an instance of ValidationResult
// return new ValidationResult(base.ErrorMessageString);
}
public RemoteClientServerAttribute(string routeName)
: base(routeName)
{
}
public RemoteClientServerAttribute(string action, string controller)
: base(action, controller)
{
}
public RemoteClientServerAttribute(string action, string controller,
string areaName)
: base(action, controller, areaName)
{
}
}
이
유효성 검사가 클라이언트 측을 통과하고 서버 측에 와서public class CategoryController : Controller
{
private ICategoryRepo categoryRepo;
public CategoryController()
{
}
public CategoryController(ICategoryRepo categoryParam)
{
this.categoryRepo = categoryParam;
}
.
.
//remote validation action
public JsonResult IsNameUnique(string Name)
{
IEnumerable<Category> categories = categoryRepo.Categories.Where(x => x.Name.Trim() == Name);
Category category = categories.FirstOrDefault();
return Json(category==null, JsonRequestBehavior.AllowGet);
}
}
, 그것은 오류를 던지고 시작이 내 컨트롤러 클래스된다.
이
오류를입니다예, 그것이 매개 변수없이 생성자를 찾을 수 없기 때문에 어떤 방법이 예외를 발견 던지고있다.
나는이
public CategoryController()
{
categoryRepo = new CategoryRepo();
}
같은 매개 변수가없는 생성자를 추가하지만 내가 Ninject에를 사용하고있는 이유는 전혀 이해가되지 않습니다, 그렇게 할 경우 문제입니다. 그것은 의존성을 만들고 있습니다. 하지만이 방법으로하지 않으면 categoryRepo는 IsNameUnique 액션에서 null 예외를 throw합니다. 그렇다면 맞춤 원격 유효성 검사 속성에서 Ninject를 어떻게 작동시킬 수 있습니까?
Activator.CreateInstance를 사용하여 컨트롤러를 만드는 대신 NInject에게 제공하도록 요청할 수 있습니까? NInject에 대해 충분히 알지 못합니다. –