webentwicklung-frage-antwort-db.com.de

Wie kann ich alle Elementwerte aus Request.Form abrufen, ohne genau anzugeben, welche mit .GetValues ​​("ElementIdName")

Zurzeit wird der folgende Code zum Erstellen eines String-Arrays (von Elementen) verwendet, das alle String-Werte aus Request.Form.GetValues ​​("ElementIdName") enthält. Das Problem ist, dass alle Dropdown-Listen in meiner Ansicht funktionieren müssen, damit dies funktioniert derselbe Element-ID-Name, den ich aus offensichtlichen Gründen nicht möchte. Daher frage ich mich, ob ich alle Zeichenfolgenwerte aus Request.Form abrufen kann, ohne den Elementnamen explizit anzugeben. Im Idealfall möchte ich nur alle Dropdown-Listenwerte abrufen. Ich bin in C # nicht zu heiß, kann aber nicht alle Element-IDs abrufen, die mit "Liste" + "**" beginnen, sodass ich meine Listen List1 benennen kann , Liste2, Liste3 usw.

Vielen Dank..

         [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

Sie können alle Schlüssel im Request.Form abrufen und anschließend die gewünschten Werte vergleichen und abrufen.

Ihr Methodenkörper sieht dann so aus:

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 Rajas Antwort mit etwas LINQ-Lambda-Spaß:

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

Hier ist eine Möglichkeit, dies zu tun, ohne den Formularelementen eine ID hinzuzufügen.

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

Dann enthält ids alle ausgewählten Optionswerte aus den Auswahllisten. Sie können die Model Binder-Route auch folgendermaßen abfahren:

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

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

Hoffe das hilft.

8
aligray