web-dev-qa-db-fra.com

Comment puis-je obtenir toutes les valeurs des éléments de Request.Form sans spécifier exactement lequel avec .GetValues ​​("ElementIdName")

En utilisant actuellement le code ci-dessous pour créer un tableau de chaînes (éléments) qui contient toutes les valeurs de chaîne de Request.Form.GetValues ​​("ElementIdName"), le problème est que pour que cela fonctionne, toutes mes listes déroulantes dans ma vue doivent avoir le même nom d'ID d'élément que je ne veux pas qu'ils pour des raisons évidentes. Je me demande donc s'il existe un moyen pour moi d'obtenir toutes les valeurs de chaîne de Request.Form sans spécifier explicitement le nom de l'élément. Idéalement, je voudrais obtenir toutes les valeurs de la liste déroulante uniquement, je ne suis pas trop chaud en C # mais il n'y a pas moyen d'obtenir tous les ID d'élément commençant par dire "List" + "**", donc je pourrais nommer mes listes List1 , List2, List3 etc.

Merci..

         [HttpPost]

    public ActionResult OrderProcessor()
    {

        string[] elements;
        elements = Request.Form.GetValues("List");

        int[] pidarray = new int[elements.Length];

        //Convert all string values in elements into int and assign to pidarray
        for (int x = 0; x < elements.Length; x++)
        {

            pidarray[x] = Convert.ToInt32(elements[x].ToString()); 
        }

        //This is the other alternative, painful way which I don't want use.

        //int id1 = int.Parse(Request.Form["List1"]);
        //int id2 = int.Parse(Request.Form["List2"]);

        //List<int> pidlist = new List<int>();
        //pidlist.Add(id1);
        //pidlist.Add(id2);


        var order = new Order();

        foreach (var productId in pidarray)
        {


            var orderdetails = new OrderDetail();

            orderdetails.ProductID = productId;
            order.OrderDetails.Add(orderdetails);
            order.OrderDate = DateTime.Now;


        }

        context.Orders.AddObject(order);
        context.SaveChanges();


        return View(order);
22
LaserBeak

Vous pouvez obtenir toutes les clés dans le formulaire Request.Form, puis comparer et obtenir les valeurs souhaitées.

Le corps de votre méthode ressemblera à ceci: -

List<int> listValues = new List<int>();
foreach (string key in Request.Form.AllKeys)
{
    if (key.StartsWith("List"))
    {
        listValues.Add(Convert.ToInt32(Request.Form[key]));
    }
}
37
Waqas Raja

Waqas Raja's answer with some LINQ lambda fun:

List<int> listValues = new List<int>();
Request.Form.AllKeys
    .Where(n => n.StartsWith("List"))
    .ToList()
    .ForEach(x => listValues.Add(int.Parse(Request.Form[x])));
14
Tyler Jensen

Voici une façon de le faire sans ajouter d'ID aux éléments du formulaire.

<form method="post">
    ...
    <select name="List">
        <option value="1">Test1</option>
        <option value="2">Test2</option>
    </select>
    <select name="List">
        <option value="3">Test3</option>
        <option value="4">Test4</option>
    </select>
    ...
</form>

public ActionResult OrderProcessor()
{
    string[] ids = Request.Form.GetValues("List");
}

Les identifiants contiendront alors toutes les valeurs d'options sélectionnées dans les listes de sélection. En outre, vous pouvez suivre l'itinéraire Model Binder comme suit:

public class OrderModel
{
    public string[] List { get; set; }
}

public ActionResult OrderProcessor(OrderModel model)
{
    string[] ids = model.List;
}

J'espère que cela t'aides.

8
aligray