ASP.NET MVC: Werte aus TextBoxFor, TextBox, DropDownList und TextArea
In ASP.Net MVC-ich bin öffnen Sie eine Ansicht aus anderer Sicht. Der erste Blick schickt zwei Werte auf den zweiten Blick. In der zweiten Ansicht kann der Benutzer eine E-Mail senden.
Ich habe zwei Probleme.
Das erste problem ist, dass die beiden Werte, die ich senden, von der ersten Ansicht nicht gezeigt wird in meinem zweiten Blick.
Das zweite problem ist, dass ich kann nicht die E-Mail-Formular zur trigger-meine E-Mail-Funktion im controller.
Hier ist eine ausführlichere Erklärung.
Meine erste Ansicht mit dem Namen ViewOne ist mit dem controller ControllerOne. In ViewOne ich habe den folgenden code zum aufrufen der zweiten Ansicht, ViewTwo:
@Html.ActionLink("Go to second view", "ViewTwo", "Home", new { firstval = firstval, secondval = secondval }, null)
Wenn die ActionLink geklickt wird, wird die folgende Funktion im controller HomeController heißt:
public ActionResult ViewTwo(string firstval, string secondval)
{
MyModel model = new MyModel();
model.firstval = firstval;
model.secondval = secondval;
var list = new SelectList(new[]
{
new {ID="1",Name="One"},
new{ID="2",Name="Two"},
new{ID="3",Name="Three"},
},
"ID", "Name", 1);
model.myList = list;
return View(model);
}
So, in der controller HomeController ich versuchen, füllen Sie das Modell myModel mit den Werten, die ich von der ersten Ansicht, ViewOne.
Das Modell MyModel sieht wie folgt aus:
public class MyModel
{
public string firstval { get; set; }
public string secondval { get; set; }
public IEnumerable<SelectListItem> myList { get; set; }
[Required]
[DisplayName("My name")]
public string reporter { get; set; }
[Required]
[DisplayName("Description")]
public string description { get; set; }
[DisplayName("Dropdown")]
public string myDropDownListValue { get; set; }
}
Ansicht ViewTwo sieht wie folgt aus:
@model myapp.Models.MyModel
@{ ViewBag.Title = "Send e-mail"; }
<hgroup class="title">
<h1>@ViewBag.Title</h1>
<h2>@ViewBag.Message</h2>
</hgroup>
@using (Html.BeginForm("sendEmail"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<fieldset>
<legend>Send e-mail</legend>
<p>First value:</p>
<p>@Html.LabelFor(m => m.firstval)</p>
<p>Second value:</p>
<p>@Html.LabelFor(m => m.secondval)</p>
<p>Reporter</p>
<p>@Html.TextBoxFor(m => m.reporter)</p>
<p>Dropdownlist</p>
<p>@Html.DropDownListFor(m => m.myDropDownListValue, Model.myList as SelectList)</p>
<p>Description:</p>
<p>@Html.TextAreaFor(m => m.description, new { @cols = 150, @rows = 5})</p>
<input type="submit" value="Send e-mail"/>
</fieldset>
}
In der Steuerung HomeController, das ist der gleiche controller, der die ViewTwo () - Funktion wird ausgelöst, unmittelbar bevor der oben genannten form wird gezeichnet, ich habe die folgende Funktion:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult sendEmail(ContactModel model) //(string keyword, string partofspeech, string reporter, string category, string description, string acceptance)
{
//code to send email
}
So, ich möchte diese Funktion, sendEmail, um ausgelöst, wenn ich das Formular abschicken. Aber das passiert nicht. Was passiert, wenn ich auf den submit-button (beschriftet mit "e-mail Senden") ist, dass die Sicht ViewTwo wird neu geladen und die ActionResult ViewTwo() in der controller-HomeController wird ausgelöst. Dies ist meine zweite (und größte) problem.
Auch, mein erstes problem ist, dass
<p>@Html.LabelFor(m => m.firstval)</p>
Zeigt nicht den Wert, der gesendet wird, von der ersten Ansicht. Es zeigt die Zeichenfolge "firstval". Bevor die form ist gezeichnet, ich sehe in der Funktion ViewTwo() der Wert wird korrekt gesendet vom ersten Blick.
Irgendwelche Ideen?
EDIT:
Zweite problem gelöst. Siehe meine Antwort unten.
- Die
ActionLink
macht ein hyperlink, der nicht erlaubt, die aktuelle form-input-Werte. Dann schau mal hier auf, wie dies zu tun stackoverflow.com/questions/3449807/... - Ich würde zufrieden sein, senden Sie einfach die Werte aus der TextBoxFor, etc, zurück zu meiner Kontrolle, wie normale Variablen. Aber du sagst, dass nicht getan werden kann? 🙁
- Ok, also Sie wollen mir das Absenden des Formulars statt. Dann kann ich einfach die <input type="submit"> Variante. Aber wie bekomme ich den controller zu verstehen, welche Funktion er verwenden soll..?
- Wenn Sie uns über 'HtmlBeginForm()' es wird die POST zurück zum aktuellen Endpunkt mit dem Formular Werte, Sie sollte wirklich fangen Sie in einer view-Modell.
- Wenn Sie nicht möchten, führen Sie einen vollständigen postback, müssen Sie Ajax verwenden. Verwenden Sie entweder Ajax.BeginForm oder einfach nur jQuery -
$.ajax
als Prozent des BIP. - Ich würde gerne einen vollständigen postback. Ich war mit einem ActionLink in die Prüfung, weil, das schien am einfachsten zu mir, aber wenn ich herausfinden kann, wie dies mit einer <input type="submit" /> stattdessen würde ich mich freuen. Aber ich kann nicht, dass die Arbeit. Siehe mein original-Beitrag unter NACHTRAG, wo ich erklärt habe, wo ich versage.
- Als StuartLC schlägt vor, die ich auch verwenden würde,$.ajax zusammen bilden.serialisieren
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie ein paar Optionen, die normalerweise mit einem postback Sie würden senden Sie das Formular mit einem
<input type="submit" value="sendEmail" />
werden die Werte in form repräsentiert werden würde, in einem ViewModel wie:Ihrem Endpunkt würde dann so Aussehen:
Wenn Sie immer noch wollen, verwenden Sie einen hyperlink, um das Formular Absenden, wird die nativ führt eine GET-Anfrage, Sie können fangen die klicken Sie auf mit javascript, und manuell senden Sie das Formular via Ajax.
Etwas wie:
Update:
Sollten Sie auch schmücken Sie Ihre post-Aktion sendEmail mit
[ValidateAntiForgeryToken]
und fügen Sie eine@Html.AntiForgeryToken()
innerhalb der form. Dies wird helfen, schützen gegen cross-site-forgery-requests.Erstellen Sie Ihre form, Endpunkt und Modell wie folgt:
Wie lange sind Sie bereits auf dem gleichen controller, es wird ein postback zu
/controllername/sendemail
mit dem Formular Daten in die post. Sollten Sie auch Aussehen up Attribute auf Ihre Modelle, die Sie durchsetzen kann-Beschreibungen und-Validierungen beispielsweise. Schauen Sie hier für mehr details, seine MVC 2, aber immer noch relevant.Wenn Sie wirklich wollen, um in der Lage sein, um die Werte statt der Entsendung Sie, ändern Sie die Formular-Aktion zu BEKOMMEN, und ändern Sie die Ziel sendEmail
Entfernen Sie den ActionLink und ersetzen Sie es mit einem einfachen submit-button
Ich weiß, Sie sagten, Sie wollten die ActionLink, aber diese erreichen die gleiche Sache
Ich es geschafft, zu lösen meinem ersten problem. Einmal habe ich angegeben, welcher controller die Funktion sendEmail ist in der, dieser code endlich ausgelöst. Etwa so:
Wenn ich jetzt nur herausfinden, warum
nicht funktioniert, dann bin ich sicher Zuhause angekommen bin.
Es tatsächlich druckt den string "firstval" statt den Wert der string-variable firstval, dass ich in der Modell. (Siehe mein Erster post für weitere detaillierte Erklärung).
EDIT:
Fixiert, dass ich Letzte problem. Die sehr werid Sache ist, dass der obige code mit LabelFor nicht funktioniert. Aber wenn ich dies anstelle:
dann bekomme ich den Wert. Aber es wird nicht gesendet zurück an den controller, wenn das Formular abgeschickt wird. Aber das habe ich gelöst mit:
So HiddenFor für mich funktioniert, LabelFor nicht.
Fall geschlossen. Werfe ich den "gelöst-Haken" der Kerl, gab mir alle, die Hilfe hier oben. Er Tat genial. Aber die wahre Lösung ist in diesem Beitrag. 🙂