문제

다른 인터페이스 목록과 해당 인터페이스를 구현 한 클래스의 속성이있는 인터페이스가 있지만, 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);
    }
}
.

다른 팁

여기에 몇 가지 잘못을하고 있습니다.

  1. AutoFac은 모델 바인딩과 아무 관련이 없습니다. AUTOFAC은 컨트롤러의 생성자에 종속성을 주입하는 것입니다. ASP.NET MVC 모델 바인더는 동작 매개 변수에 HTTP 요청을 바인드합니다. 그들은 완전히 별도의 관심사입니다. IMaster 종속성 주입의 을 제거하십시오.
  2. MVC는 인스턴스화 할 콘크리트 유형을 알지 못하기 때문에 양식 게시물을 인터페이스에 바인딩 할 수 없습니다. IMaster 인터페이스를 잊어 버리고 구체적인 뷰 모델 유형을 사용하십시오.
  3. 생성자 매개 변수가 아닌 동작 매개 변수에 바인딩 된 게시물을 형성합니다. Master 객체를 허용하는 조치 메소드가 있어야합니다.
  4. 이 옵션이 인덱스 조치 인 경우, HomeController 내부에서 이와 같이 보이는 액션 메소드가 있어야합니다.

    [HttpPost]
    public ActionResult Index(Master model)
    {
        ...
    }
    
    .

    다른 변경 사항을 얻으려면 다른 변경 사항을 가져야 할 수도 있지만 오른쪽 트랙에서 설정해야합니다 (지금 코드가 매우 혼란스러워 보입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top