AutoFac은 ViewModel의 데이터를 바인딩하지 않습니다
-
02-01-2020 - |
문제
다른 인터페이스 목록과 해당 인터페이스를 구현 한 클래스의 속성이있는 인터페이스가 있지만, AutoFac에 등록했으나 내 문제는 내 수업에 데이터를 바인드하지 않습니다. 아래 코드를 썼습니다.:
내 인터페이스 :
public interface IDetail
{
int Id { get; set; }
string Name { get; set; }
}
public interface IMaster
{
int Id { get; set; }
DateTime Description { get; set; }
List<IDetail> Details { get; set; }
}
.
내 수업 :
public class Detail : IDetail
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Master : IMaster
{
public int Id { get; set; }
public DateTime Description { get; set; }
public List<IDetail> Details { get; set; }
}
.
내 컨트롤러 :
public class HomeController : Controller
{
IMaster _t;
[HttpPost]
public ActionResult Create(IMaster t)
{
_t = t;
}
}
.
내 자동 AUTOFAC 등록 :
public class DependencyConfigure
{
//Initializing
public static void Initialize()
{
RegisterServices();
}
//Registering
private static void RegisterServices()
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(
typeof(MvcApplication).Assembly
).PropertiesAutowired();
builder.RegisterType<ExtensibleActionInvoker>()
.As<IActionInvoker>()
.WithParameter("injectActionMethodParameters", true);
builder.RegisterControllers(Assembly.GetExecutingAssembly())
.InjectActionInvoker();
builder.RegisterType(typeof(Master)).As(typeof(IMaster));
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
.
와 뷰는 다음과 같습니다.
@model WebApplication1.Models.Master
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(model => model.Description, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
</div>
<div>
@Html.Label("Details.Name", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.Editor("Details[0].Name")
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
.
다른 단어의 경우, 제출할 때 마스터. Master.details에 데이터가 바인딩되지 않음 ...
해결책 2
올바른 답변은 여기에서 뷰 모델에 데이터를 바인딩하기 전에 사용자 정의 바인더를 MVC에 쓸 필요가 있습니다. ViewModel의 인스턴스를 만들고 viewModel에 데이터를 바인드합니다.여기에 바인더 샘플을 볼 수 있습니다 (친애하는 freind 수석 개발자 @saeed hamed로 작성한 것)
public class InterfaceModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
if (modelType.IsInterface)
{
return new InterfaceModelBinder();
}
return null;
}
}
public class InterfaceModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var item = DependencyResolver.Current.GetService(bindingContext.ModelType);
bindingContext.ModelMetadata = new ModelMetadata(new DataAnnotationsModelMetadataProvider(),
bindingContext.ModelMetadata.ContainerType, () => item, item.GetType(), bindingContext.ModelName);
return base.BindModel(controllerContext, bindingContext);
}
}
. 다른 팁
여기에 몇 가지 잘못을하고 있습니다.
- AutoFac은 모델 바인딩과 아무 관련이 없습니다. AUTOFAC은 컨트롤러의 생성자에 종속성을 주입하는 것입니다. ASP.NET MVC 모델 바인더는 동작 매개 변수에 HTTP 요청을 바인드합니다. 그들은 완전히 별도의 관심사입니다.
IMaster
종속성 주입의 을 제거하십시오. - MVC는 인스턴스화 할 콘크리트 유형을 알지 못하기 때문에 양식 게시물을 인터페이스에 바인딩 할 수 없습니다.
IMaster
인터페이스를 잊어 버리고 구체적인 뷰 모델 유형을 사용하십시오. - 생성자 매개 변수가 아닌 동작 매개 변수에 바인딩 된 게시물을 형성합니다.
Master
객체를 허용하는 조치 메소드가 있어야합니다.
이 옵션이 인덱스 조치 인 경우, HomeController
내부에서 이와 같이 보이는 액션 메소드가 있어야합니다.
[HttpPost]
public ActionResult Index(Master model)
{
...
}
.
다른 변경 사항을 얻으려면 다른 변경 사항을 가져야 할 수도 있지만 오른쪽 트랙에서 설정해야합니다 (지금 코드가 매우 혼란스러워 보입니다).
제휴하지 않습니다 StackOverflow