2016-04-19 6 views
0

Ich beginne in der SteuerungIch habe ein zweites Modell Ich versuche, eine Ansicht auszufüllen und zurückzukehren. MVC 5

ViewBag.EmailStuff = new EmailStuff(); 

dann in der Ansicht, ich versuche, dieses Modell zu bekommen, weil die Ansicht auf einem anderen basiert.

@{var es = ViewBag.EmailStuff as EmailStuff;} 


@using (Html.BeginForm("ContactStore", "Store", FormMethod.Post, new {emailstuff=es)) 

und ich habe die Validaton für diese 2 Feldern arbeiten, feuert sie, wenn sie

@Html.EditorFor(m => es.EventName) 
@Html.ValidationMessageFor(m => es.EventName, "", new { @class = "text-danger-yellow" }) 
<br /> 

@Html.EditorFor(m => es.MessageBody) 
@Html.ValidationMessageFor(m => es.MessageBody, "", new { @class = "text-danger-yellow" }) 

leer sind, aber ich kann nicht herausfinden, wie die Werte an den Controller zu erhalten, wenn die Felder Infos in ihnen.

Am Controller gibt das Modell, auf das ich verweise, Nullen für beide Eingaben zurück, obwohl DataAnnotations funktioniert.

Ich weiß, das ist ein Hack. Ich versuche, die Forms-Sammlung zu verlassen und zu lernen, wie man Modelle verwendet. Die Ansicht selbst verwendet ein anderes Modell als das, das ich zu validieren versuche. Am oberen Rand der Ansicht können Sie ein anderes Modell sehen, das nichts mit den 2 Feldern zu tun hat, die ich an einen E-Mailer sende.

@model Stores.Models.vProfiles 
@using Microsoft.AspNet.Identity 
@using Microsoft.AspNet.Identity.EntityFramework 
@using Stores.Models 

Hier ist, wo die Informationen in sein soll kommen:

public ActionResult ContactStore(EmailStuff emailstuff) 
{ 

Hier ist mein Modell:

public class EmailStuff 
    { 
     [Required(ErrorMessage = "Enter an event name")] 
     public string EventName { get; set; } 
     [Required(ErrorMessage = "You need to enter a message")] 
     public string MessageBody { get; set; } 


    } 
} 

Ich werde wahrscheinlich für alle diese Spaghetti in der Hölle verbrennen , aber ich hoffe, dass es eine einfache Lösung gibt, die ich vermisse (neben dem Zusammenkleben mehrerer Ansichten).

+0

Erstellen Sie ein Ansichtsmodell, das die von Ihnen benötigten Eigenschaften enthält. Verwenden Sie nicht 'ViewBag'. Wenn Sie Eingaben mit Namensattributen erstellen, die keine Beziehung zu Ihrem Modell haben, können Sie nicht an Ihr Modell binden. Alternativ können Sie '@ Html.Action()' verwenden, um eine Servermethode aufzurufen, die eine Teilansicht Ihres Formulars zurückgibt. –

+0

In Ihrem Formular sagen Sie, dass Ihre POST-Aktionen ContactShuttle (im Shuttle-Controller) sind. In der Steuerung, die Sie gezeigt haben, sehen wir, dass die Aktion ContactStore genannt wird. – ssimeonov

+0

sorry ssimeonov. Ich benutzte einen Code, den ich irgendwo gefunden hatte. – JustJohn

Antwort

0

Genau wie @Stephen sagte Rückkehr gleichen Modells zur Ansicht wie;

var emailStuff = new EmailStuff(); 
emailStuff = ViewBag.EmailStuff; 
return View(emailStuff); 

und in der Ansicht wie folgt verwenden.

Danach sollten Sie die gewünschten Daten auf der Seite des Controllers erhalten, wenn Sie das Formular posten.

+0

Ja, Qsprec, das sieht gut aus für die View, die auf EmailStuff basiert, aber wenn Sie in meine Frage schauen, habe ich ein anderes Model, auf dem die View basiert. – JustJohn

+0

Sie können ein neues Modell erstellen, das diese beiden Modelle enthält, und dieses Modell an die Ansicht übergeben. Hast du das versucht? – Qsprec

+0

Ja. Zieht mir derzeit die Haare aus, weil nur eines der Modelle mit Daten zurückkommt. Der andere ist für DisplayFor-Helfer, aber ich brauche seine ID, die zurückkommt. Aber, es kommt Null zurück. – JustJohn

0

Also habe ich ein großes Modell gemacht, um die 2 Modelle zu halten.

public class MainPageModel 
    { 
    public Model1 Model1 
     { get; set; } 
    public Model2 Model2 
     { get; set; } 
    } 

Dann füllte ich einen von ihnen in das ActionResult, das die Ansicht öffnete. (Der andere eine E-Mail Betreff und Message zu sammeln war.)

Model.Model1 = context.myTable(where whatever = id) 

und schickte das große Modell mit dem View

return View(Model) 

In der Ansicht erklärte ich das große Modell an der Spitze

@model myAppName.Models.Model 

und füllte eine Reihe von @ Html.DisplayFor (m => m.Model.Model1) (beachten Sie, wie ich das Teilmodell referenzierte... Ich lerne!)

Das andere Modell eine E-Mail mit Message

@TextAreaFor (m=>m.Model.Model2) 

nun auf dem Formular abgesendet haben, das große Modell ging an die Action ich wollte, aber die Model.Model1 war null zu erhalten verwendet wurde! Stelle dir das vor. Ich musste die Model.Model1.AccountID in eine @ Html.HiddenFor setzen, bevor irgendetwas an den Controller zurückgegeben würde.

Warum? Nun, nachdem ich mir die Hälfte meiner Haare ausgezogen habe, hat mir jemand bei der Arbeit gesagt, dass man ein Model nicht weitergeben kann, ohne es in einem @ Html.EditorFor oder @ Html.HiddenFor zu bearbeiten. . . . @ Html.DisplayFor würde den Job nicht tun. . . .so ging ich mit einem @ Html.Hiddenfor um meine AccountID wieder in den Controller zu bekommen. Ich konnte sehen, dass das Modell kam, aber es war null, bis ich den HiddenFor benutzt habe.

Sie lernen jeden Tag etwas Neues. Schade, dass ich 8 Stunden damit verbracht habe, das herauszufinden. Ich schätze die Hilfe von allen.

Ich hoffe, dass dies jemand außer mir hilft. Und danke euch allen.

Verwandte Themen