Ich habe ein Registrierungsformular, das einen Benutzernamen (Textbox), E-Mail (Textbox) und Division (SelectList) anzeigt. Der Name und die E-Mail-Adresse sind bereits ausgefüllt (ich verwende die Windows-Authentifizierung, Intranet-App), und ich möchte den SelectedValue von DropDown als Int32 an meinen Controller senden. Ich möchte nicht die gesamte SelectList zurücksenden. Diese Liste ist jetzt klein, wird aber zu beträchtlicher Größe wachsen.Pass SelectList "SelectedValue" zu Controller Aktionsmethode
I eine Klasse namens RegistrationViewModel
, enthält es öffentliche Eigenschaften für diese Felder. Wenn ich jedoch SelectList
für die DivisionList verwende, erhalte ich diesen Fehler: No parameterless constructor defined for this object.
.
Wenn ich den Typ ändern, funktioniert es kein Problem, aber Division ist null oder 0. Gibt es eine Möglichkeit, den SelectedValue von einem DropDown an eine Controller Action-Methode als Int32 übergeben?
Edit 1:
Ich bin nicht wirklich sicher, was ich tue, ich habe etwa 48 Stunden für MVC wurde verwenden, beobachtete das PDF, TechEd und TechDays Videos.
Ich entschuldige mich, hier ist mein Controller-Code:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(RegistrationViewModel rvm)
{
IApplicationContext context = ContextRegistry.GetContext();
IValidationErrors errors = new ValidationErrors();
IValidator validator = (IValidator)context.GetObject("RegistrationValidator");
bool valid = validator.Validate(rvm, errors);
if (valid)
repo.SaveRegistration();
else
ViewData["DivisionList"] = repo.GetDivisions();
return View(rvm);
}
RegistrationViewModel
Klasse
public class RegistrationViewModel
{
public string Name { get; set; }
public string Email { get; set; }
//public SelectList DivisionList { get; private set; }
public int Division { get; set; }
}
Hier ist der Ansicht
<%@ Page Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<RegistrationViewModel>" %>
<%@ Import Namespace="Project1.Entities"%>
<%@ Import Namespace="Project1.Models"%>
<asp:Content ID="registerTitle" ContentPlaceHolderID="TitleContent" runat="server">
Register
</asp:Content>
<asp:Content ID="registerContent" ContentPlaceHolderID="MainContent" runat="server">
...
<% using (Html.BeginForm())
{ %>
<div>
<fieldset>
<legend>Account Information</legend>
<p>
<label for="name">Name:</label>
<%= Html.TextBox("Name", User.Identity.Name.GetDisplayName()) %>
<%= Html.ValidationMessage("username") %>
</p>
<p>
<label for="email">Email:</label>
<%= Html.TextBox("email", User.Identity.Name.GetEmailFromLogin()) %>
<%= Html.ValidationMessage("email") %>
</p>
<p>
<label for="division">Division:</label>
<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%>
<%= Html.ValidationMessage("confirmPassword") %>
</p>
<p>
<input type="submit" value="Register" />
</p>
</fieldset>
</div>
<% } %>
</asp:Content>
Edit 2:
Eilon: Hier i was ich es auch geändert:
Controller:
public ActionResult Register()
{
ViewData["DivisionList"] = repo.GetDivisions();
return View();
}
Ausblick:
<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%>
Ich erhalte diese Ausnahme: Es gibt keinen Viewdata Punkt mit der Taste 'DivisionValue' vom Typ ‚IEnumerable ".
Als ich den Blick auf diese aktualisiert:
<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%>
Es ist einfach großartig funktioniert! Es scheint nur zu funktionieren, wenn alle "Division" -Elemente identisch benannt sind. Wenn ich den Namen ändere, stürzt die View ab oder die ViewModel "Division" Eigenschaft wird als 0 gesendet.
Warum ist das?
public string DivisionValue { get; set; }
oder die Art ändern, um int, Datum- und oder was auch immer die geeignete Art ist:
Bitte zeigen Sie uns Ihren Controller Action Code. Wie übermittelst du den Wert der E-Mail-Textbox? – ichiban