我有一个接口,它具有一个属性,它是另一个接口的列表和实现该接口的类,我为autofac注册了,但我的问题是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的实例,然后将数据绑定到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 Model Binder将HTTP请求绑定到操作参数。它们是完全分开的问题。 获取您的IMaster依赖注入的
  2. MVC不能将表单帖子绑定到界面,因为它不知道用于实例化的具体类型。忘记IMaster接口并使用具体视图模型类型。
  3. 表单帖子绑定到动作参数,而不是构造函数参数。您应该有一个接受生成的动作方法,该方法接受生成的方法对象。
  4. 假设这是您的索引操作,您应该有一个操作方法,它在Master中查看类似的方法:

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

    您可能需要做出其他更改以获得您所在的位置,但这应该将您放在右侧轨道上(现在,您的代码看起来非常困惑)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top