Frage

Ich habe eine Schnittstelle mit einer Eigenschaft, die eine Liste einer anderen Schnittstelle und einer Klasse ist, die diese Schnittstelle implementiert hat. Ich habe sie für Autofac registriert, aber mein Problem ist, dass Autofac keine Daten an meine Klasse bindet. ich habe meinen Code unten geschrieben :

Meine Schnittstellen :

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; }
}

Meine Klassen :

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; }
}

Mein Controller :

public class HomeController : Controller
    {
        IMaster _t;

        [HttpPost]
        public ActionResult Create(IMaster t)
        {
            _t = t;
        }


    }

Meine Autofac-Registrierung :

    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));            
            }

        }

und die Aussicht ist hier :

@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>

Mit anderen Worten, wenn ich übermittle, werden Daten nicht an den Master gebunden.Hinweise...

War es hilfreich?

Lösung 2

Die richtige Antwort ist hier, aus diesem Grund müssen Sie einen benutzerdefinierten Bindemittel an MVC schreiben, bevor Sie Ihre Daten in Ihr ViewModel binden, eine Instanz von ViewModel erstellen und dann Daten an ViewModel binden.Sie können hier eine Muster von Bindemittel sehen (die von meinem lieben Freand Senior Developer @saeed heißt)

generasacodicetagpre.

Andere Tipps

Du machst hier ein paar Dinge falsch.

  1. Autofac hat nichts mit Modellbindung zu tun.Autofac dient zum Einfügen von Abhängigkeiten in den Konstruktor Ihres Controllers;die ASP.NET MVC Model Binder bindet HTTP-Anforderungen an Aktionsparameter.Sie sind völlig getrennte Anliegen. Loswerden von deinem IMaster Abhängigkeitsinjektion.
  2. MVC kann einen Formularbeitrag nicht an eine Schnittstelle binden, da er nicht weiß, welcher konkrete Typ instanziiert werden soll.Vergiss das IMaster schnittstelle und verwenden Sie einen konkreten Ansichtsmodelltyp.
  3. Formularpfosten binden an Aktion parameter, nicht Konstruktor Rahmenbedingungen.Sie sollten eine Aktionsmethode haben, die a akzeptiert Master Objekt.

Angenommen, dies ist Ihre Indexaktion, sollten Sie eine Aktionsmethode haben, die in Ihrem ungefähr so aussieht HomeController:

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

Möglicherweise müssen Sie andere Änderungen vornehmen, um dorthin zu gelangen, wohin Sie gehen, aber dies sollte Sie auf den richtigen Weg bringen (im Moment sieht Ihr Code sehr verwirrt aus).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top