autofac bindet keine Daten in Viewmodel
-
02-01-2020 - |
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...
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.
- 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. - 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. - 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).