2011-10-10 2 views
0

J'ai un table où chaque tr est groupé en ayant leurs input éléments name mis à une valeur qui est unique pour chaque ligne.Comment puis-je accéder en toute sécurité aux groupes de clés dans FormCollection?

Par exemple,

<td> 
     <input data-field="opps" type="text" value="somevalue" name="@item.Code" /> 
    </td> 
    <td> 
     <input data-field="asc" type="text" value="somevalue2" name="@item.Code" /> 
    </td> 

POST Sur

[HttpPost] 
     public ActionResult Update(FormCollection collection) 
     { 
      try 
      { 
       //doin work on collection...order assumed static 

       return RedirectToAction("Index"); 
      } 
      catch 
      { 
       return View(); 
      } 
     } 

mon System.Web.MVC.FormCollection est regroupée dans le même ordre que je définir la <td>. Je n'aime pas supposer l'ordre, mais sans accès à mon data-field, je ne sais pas ce que je peux faire d'autre (peut-être que je pourrais ajouter la valeur du champ de données comme préfixe au name et le mettre ensemble avec une coutume collection et Regex..mais cela semble dingue).

Existe-t-il un moyen d'accéder au data-field? De cette façon, je ne suis pas fragile pour re-commander ou ajouter de nouvelles colonnes dans la vue.

+0

Avez-vous essayé d'utiliser le modèle pour collecter des données? De cette façon, vous n'avez pas à vous soucier de l'ordre des articles dans FormCollection. –

+0

@Huske - Non, je ne suis pas sûr de ce que vous voulez dire. Avez-vous des liens d'exemples ou souhaitez poster une réponse? –

+0

Vous ne pourrez pas accéder à ce côté serveur de champ de données. Je suis un peu flou sur votre objectif réel ici. Pourriez-vous expliquer plus? – Mallioch

Répondre

1

Disons que vous avez une classe (modèle) défini comme ceci:

public class MyModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

En vous contrôleur, vous pourriez avoir une action appelée Créer, comme ceci:

[HttpGet] 
public ViewResult Create() 
{ 
    MyModel sampleModel = new MyModel(); 
    return View(sampleModel); 
} 

[HttpPost] 
public ActionResult Create(MyModel sampleModel) 
{ 
    if (ModelState.IsValid) 
    { 
     TempData["Error"] = "There were errors. Please correct the problem and submit again"; 
     return View(sampleModel); 
    } 

    // At this point everything is fine and you can access data in your sampleModel 
    if (sampleModel.Age >= 16) 
    { 
     return RedirectToAction("LegalAccess"); 
    } 
    else 
    { 
     TempData["Error"] = "You must be 16 or over to access this site";  
     return RedirectToAction("AgeRestriction"); 
    } 
} 

Lorsque vous créez un vue fortement typée qui utilise MyModel comme modèle, vous pouvez le définir quelque chose comme ceci:

@model MyModel 

@{ 
    Layout = "~/Shared/_Layout.cshtml"; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.FirstName) 
    @Html.TextBoxFor(m => m.FirstName) 
    <br /> 
    @Html.LabelFor(m => m.LastName) 
    @Html.TextBoxFor(m => m.LastName) 
    <br /> 
    @Html.LabelFor(m => m.LastName) 
    @Html.TextBoxFor(m => m.LastName) 

    <input type="submit" value="Submit" />   
} 

Quand Si vous soumettez ce formulaire, le classeur modèle copie en arrière-plan les données de ce formulaire à l'aide de Request.Form dans un objet de type MyModel qu'il crée en arrière-plan. Ce nouvel objet est transmis à une action qui gère la méthode HTTP POST. Avec cela, vous obtenez un objet fortement typé et vous n'avez pas à vous soucier de l'ordre des éléments dans FormCollection.

J'espère avoir aidé à répondre à votre question.

BTW. J'ai écrit ceci sans Visual Studio, donc j'espère qu'il n'y a pas d'erreurs. :-)

Questions connexes