Ich habe eine Dropdown-Liste, die ich aus der Datenbank gefüllt habe. Jetzt muss ich den ausgewählten Wert in Controller etwas manipulieren lassen. Aber nicht auf die Idee kommen. Code, den ich ausprobiert habe.
public class MobileViewModel
{
public List<tbInsertMobile> MobileList;
public SelectList Vendor { get; set; }
}
public ActionResult ShowAllMobileDetails()
{
MobileViewModel MV = new MobileViewModel();
MV.MobileList = db.Usp_InsertUpdateDelete(null, "", "", null, "", 4, MergeOption.AppendOnly).ToList();
MV.Vendor = new SelectList(db.Usp_VendorList(), "VendorId", "VendorName");
return View(MV);
}
[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV)
{
string strDDLValue = ""; // Here i need the dropdownlist value
return View(MV);
}
<table>
<tr>
<td>Mobile Manufacured</td>
<td>@Html.DropDownList("ddlVendor", Model.Vendor, "Select Manufacurer") </td>
</tr>
<tr>
<td>
</td>
<td>
<input id="Submit1" type="submit" value="search" />
</td>
</tr>
</table>
Sie können es von Request
lesen, indem Sie Request.Form
verwenden. Ihr Dropdown-Name lautet ddlVendor
. Übergeben Sie also den ddlVendor
-Schlüssel in der formCollection, um den von form geposteten Wert zu erhalten:
string strDDLValue = Request.Form["ddlVendor"].ToString();
oder FormCollection
verwenden:
[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV,FormCollection form)
{
string strDDLValue = form["ddlVendor"].ToString();
return View(MV);
}
Wenn Sie mit der Modellbindung möchten, fügen Sie eine Eigenschaft in Model hinzu:
public class MobileViewModel
{
public List<tbInsertMobile> MobileList;
public SelectList Vendor { get; set; }
public string SelectedVendor {get;set;}
}
und in View:
@Html.DropDownListFor(m=>m.SelectedVendor , Model.Vendor, "Select Manufacurer")
und in Aktion:
[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV)
{
string SelectedValue = MV.SelectedVendor;
return View(MV);
}
Wenn Sie auch den Text des ausgewählten Elements veröffentlichen möchten, müssen Sie ein ausgeblendetes Feld hinzufügen und bei Auswahl der Dropdown-Auswahl den ausgewählten Elementtext in das ausgeblendete Feld setzen:
public class MobileViewModel
{
public List<tbInsertMobile> MobileList;
public SelectList Vendor { get; set; }
public string SelectVendor {get;set;}
public string SelectedvendorText { get; set; }
}
verwenden Sie Jquery, um ein verstecktes Feld festzulegen:
<script type="text/javascript">
$(function(){
$("#SelectedVendor").on("change", function {
$("#SelectedvendorText").val($(this).text());
});
});
</script>
@Html.DropDownListFor(m=>m.SelectedVendor , Model.Vendor, "Select Manufacurer")
@Html.HiddenFor(m=>m.SelectedvendorText)
Sehr grundlegendes Modell mit Gender-Feld. GetGenderSelectItems()
gibt ausgewählte Elemente zurück, die zum Auffüllen von DropDownList benötigt werden.
public enum Gender
{
Male, Female
}
public class MyModel
{
public Gender Gender { get; set; }
public static IEnumerable<SelectListItem> GetGenderSelectItems()
{
yield return new SelectListItem { Text = "Male", Value = "Male" };
yield return new SelectListItem { Text = "Female", Value = "Female" };
}
}
Bitte stellen Sie sicher, dass Sie Ihren @Html.DropDownListFor
in ein Formular-Tag verpackt haben.
@model MyModel
@using (Html.BeginForm("MyController", "MyAction", FormMethod.Post)
{
@Html.DropDownListFor(m => m.Gender, MyModel.GetGenderSelectItems())
<input type="submit" value="Send" />
}
Ihr .cshtml Razor-Ansichtsname sollte mit dem Controller-Aktionsnamen identisch sein, und der Ordnername sollte mit dem Controller-Namen übereinstimmen, z. B. Views\MyController\MyAction.cshtml
.
public class MyController : Controller
{
public ActionResult MyAction()
{
// shows your form when you load the page
return View();
}
[HttpPost]
public ActionResult MyAction(MyModel model)
{
// the value is received in the controller.
var selectedGender = model.Gender;
return View(model);
}
}
Jetzt machen wir es stark typisiert und enum unabhängig:
var genderSelectItems = Enum.GetValues(typeof(Gender))
.Cast<string>()
.Select(genderString => new SelectListItem
{
Text = genderString,
Value = genderString,
}).AsEnumerable();
MVC 5/6/Rasiermesser
Ich denke, der beste Weg ist mit einem stark typisierten Modell, weil Viewbags bereits zu stark beansprucht werden :)
MVC 5 Beispiel
Deine Get Action
public async Task<ActionResult> Register()
{
var model = new RegistrationViewModel
{
Roles = GetRoles()
};
return View(model);
}
Ihr Ansichtsmodell
public class RegistrationViewModel
{
public string Name { get; set; }
public int? RoleId { get; set; }
public List<SelectListItem> Roles { get; set; }
}
Deine Ansicht
<div class="form-group">
@Html.LabelFor(model => model.RoleId, htmlAttributes: new { @class = "col-form-label" })
<div class="col-form-txt">
@Html.DropDownListFor(model => model.RoleId, Model.Roles, "--Select Role--", new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.RoleId, "", new { @class = "text-danger" })
</div>
</div>
Deine Post-Aktion
[HttpPost, ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegistrationViewModel model)
{
if (ModelState.IsValid)
{
var _roleId = model.RoleId,
MVC 6 Es wird etwas anders sein
Holen Sie sich Aktion
public async Task<ActionResult> Register()
{
var _roles = new List<SelectListItem>();
_roles.Add(new SelectListItem
{
Text = "Select",
Value = ""
});
foreach (var role in GetRoles())
{
_roles.Add(new SelectListItem
{
Text = z.Name,
Value = z.Id
});
}
var model = new RegistrationViewModel
{
Roles = _roles
};
return View(model);
}
Ihr View Model wird mit MVC 5 identisch sein
Ihre Ansicht wird wie sein
<select asp-for="RoleId" asp-items="Model.Roles"></select>
Post wird auch gleich sein
Rasiermesserseiten
Ihr Seitenmodell
[BindProperty]
public int User User { get; set; } = 1;
public List<SelectListItem> Roles { get; set; }
public void OnGet()
{
Roles = new List<SelectListItem> {
new SelectListItem { Value = "1", Text = "X" },
new SelectListItem { Value = "2", Text = "Y" },
new SelectListItem { Value = "3", Text = "Z" },
};
}
<select asp-for="User" asp-items="Model.Roles">
<option value="">Select Role</option>
</select>
Ich hoffe es kann jemandem helfen :)
Verwenden Sie SelectList, um @HtmlDropdownListFor zu binden, und geben Sie den selectedValue-Parameter darin an.
http://msdn.Microsoft.com/de-de/library/dd492553(v=vs.108).aspx
Beispiel: Sie können dies tun, um venderid zu erhalten
@Html.DropDownListFor(m => m.VendorId,Model.Vendor)
public class MobileViewModel
{
public List<tbInsertMobile> MobileList;
public SelectList Vendor { get; set; }
public int VenderID{get;set;}
}
[HttpPost]
public ActionResult Action(MobileViewModel model)
{
var Id = model.VenderID;
Wenn Sie etwas Leichtgewichtiges suchen, füge ich Ihrer Aktion einen Parameter hinzu.
[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV, string ddlVendor)
{
string strDDLValue = ddlVendor; // Of course, this becomes silly.
return View(MV);
}
Was jetzt in Ihrem Code passiert, ist, dass Sie das erste Zeichenfolgenargument von "ddlVendor" an Html.DropDownList
übergeben, und das MVC-Framework wird aufgefordert, ein <select>
-Element mit einer name
von "ddlVendor" zu erstellen. Wenn der Benutzer das Formular clientseitig übermittelt, enthält es einen Wert für diesen Schlüssel.
Wenn MVC versucht, diese Anforderung in MV
zu parsen, wird nach MobileList
und Vendor
gesucht und auch nicht gefunden, so dass sie nicht gefüllt wird. Wenn Sie diesen Parameter hinzufügen oder FormCollection
als andere Antwort verwenden, bitten Sie MVC, speziell nach einem Formularelement mit diesem Namen zu suchen, und dann den Parameterwert mit dem angegebenen Wert zu füllen.
Ich hatte das gleiche Problem in asp.NET Rasierer C #
Ich hatte eine ComboBox
, die mit Titeln einer EventMessage
gefüllt war, und ich wollte den Inhalt dieser Nachricht mit ihrem ausgewählten Wert anzeigen, um ihn in einem Etikett oder TextField
oder einer anderen Control
... anzuzeigen.
Meine ComboBox
wurde folgendermaßen gefüllt:
@Html.DropDownList("EventBerichten", new SelectList(ViewBag.EventBerichten, "EventBerichtenID", "Titel"), new { @class = "form-control", onchange = "$(this.form).submit();" })
In meiner EventController
hatte ich eine Funktion, um zu der Seite zu gelangen, auf der ich meine ComboBox
anzeigen wollte (was von einem anderen Modelltyp ist, also musste ich eine Teilansicht verwenden)?
Die Funktion, um vom Index auf die Seite zu gelangen, in die die Teilansicht geladen werden soll:
public ActionResult EventDetail(int id)
{
Event eventOrg = db.Event.Include(s => s.Files).SingleOrDefault(s => s.EventID == id);
// EventOrg eventOrg = db.EventOrgs.Find(id);
if (eventOrg == null)
{
return HttpNotFound();
}
ViewBag.EventBerichten = GetEventBerichtenLijst(id);
ViewBag.eventOrg = eventOrg;
return View(eventOrg);
}
Die Funktion für die Teilansicht ist hier:
public PartialViewResult InhoudByIdPartial(int id)
{
return PartialView(
db.EventBericht.Where(r => r.EventID == id).ToList());
}
Die Funktion zum Auffüllen von EventBerichten:
public List<EventBerichten> GetEventBerichtenLijst(int id)
{
var eventLijst = db.EventBericht.ToList();
var berLijst = new List<EventBerichten>();
foreach (var ber in eventLijst)
{
if (ber.EventID == id )
{
berLijst.Add(ber);
}
}
return berLijst;
}
Das partialView-Modell sieht folgendermaßen aus:
@model IEnumerable<STUVF_back_end.Models.EventBerichten>
<table>
<tr>
<th>
EventID
</th>
<th>
Titel
</th>
<th>
Inhoud
</th>
<th>
BerichtDatum
</th>
<th>
BerichtTijd
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.EventID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Titel)
</td>
<td>
@Html.DisplayFor(modelItem => item.Inhoud)
</td>
<td>
@Html.DisplayFor(modelItem => item.BerichtDatum)
</td>
<td>
@Html.DisplayFor(modelItem => item.BerichtTijd)
</td>
</tr>
}
</table>
VIEUW: Dies ist das Skript, mit dem meine Ausgabe in der Ansicht abgerufen wird
<script type="text/javascript">
$(document).ready(function () {
$("#EventBerichten").change(function () {
$("#log").ajaxError(function (event, jqxhr, settings, exception) {
alert(exception);
});
var BerichtSelected = $("select option:selected").first().text();
$.get('@Url.Action("InhoudByIdPartial")',
{ EventBerichtID: BerichtSelected }, function (data) {
$("#target").html(data);
});
});
});
</script>
@{
Html.RenderAction("InhoudByIdPartial", Model.EventID);
}
<fieldset>
<legend>Berichten over dit Evenement</legend>
<div>
@Html.DropDownList("EventBerichten", new SelectList(ViewBag.EventBerichten, "EventBerichtenID", "Titel"), new { @class = "form-control", onchange = "$(this.form).submit();" })
</div>
<br />
<div id="target">
</div>
<div id="log">
</div>
</fieldset>
Wenn Sie @Html.DropDownList
verwenden möchten, folgen Sie diesen Anweisungen.
Regler:
var categoryList = context.Categories.Select(c => c.CategoryName).ToList();
ViewBag.CategoryList = categoryList;
Aussicht:
@Html.DropDownList("Category", new SelectList(ViewBag.CategoryList), "Choose Category", new { @class = "form-control" })
$("#Category").on("change", function () {
var q = $("#Category").val();
console.log("val = " + q);
});
Einfache Lösung nicht sicher, ob dies vorgeschlagen wurde oder nicht. Dies kann auch für einige Dinge nicht funktionieren. Davon abgesehen ist dies die einfache Lösung unten.
new SelectListItem { Value = "1", Text = "Waiting Invoices", Selected = true}
List<SelectListItem> InvoiceStatusDD = new List<SelectListItem>();
InvoiceStatusDD.Add(new SelectListItem { Value = "0", Text = "All Invoices" });
InvoiceStatusDD.Add(new SelectListItem { Value = "1", Text = "Waiting Invoices", Selected = true});
InvoiceStatusDD.Add(new SelectListItem { Value = "7", Text = "Client Approved Invoices" });
@Html.DropDownList("InvoiceStatus", InvoiceStatusDD)
Sie können dies auch für eine datenbankgesteuerte Auswahlliste tun. Sie müssen in Ihrem Controller ausgewählt einstellen
@Html.DropDownList("ApprovalProfile", (IEnumerable<SelectListItem>)ViewData["ApprovalProfiles"], "All Employees")
So ähnlich, aber es gibt bessere Lösungen. Dies ist nur eine Methode.
foreach (CountryModel item in CountryModel.GetCountryList())
{
if (item.CountryPhoneCode.Trim() != "974")
{
countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode });
}
else {
countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode,Selected=true });
}
}
Danke - das hat mir geholfen, besser zu verstehen, und ein Problem zu lösen, das ich hatte ... Die JQuery stellte den Text von selectedItem zur Verfügung und arbeitete NICHT für mich
$(function () {
$("#SelectedVender").on("change", function () {
$("#SelectedvendorText").val($(**"#SelectedVender option:selected"**).text());
});
});