it-swarm.com.de

So erhalten Sie den DropDownList-Wert im Controller in MVC

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.

Modell

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
}

Regler

 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);
    }

Aussicht

   <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>
40
Raghubar

1. Ansatz (über Request oder FormCollection):

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);
}

2. Ansatz (über Modell):

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);
}

AKTUALISIEREN:

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)
77
Ehsan Sajjad

Modell

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" };
    }
}

Aussicht

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" />
}

Regler

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);
    }
}

Weitergehen

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();
9
Andrei

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 :)

1
dnxit

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;
1
Pranay Rana

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.

1
Matthew Haugen

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>
1
Pieter Bollen

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);
});
0
Guven Ozkurt

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 });

        }
    }
0
Deathstalker

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());
  });
});
0
Gil Yoktan