2011-10-10 14 views
0

私はtableを持っています。各trは、inputの要素nameを各行に固有の値に設定することによってグループ化されています。 POSTFormCollectionのキーグループに安全にアクセスするにはどうすればよいですか?

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

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

例えば、

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

System.Web.MVC.FormCollectionは私が<td>を定義するのと同じ順序でグループ化されています。私は命令を引き受けるのは好きではないが、data-fieldにアクセスできない場合、何か他に何ができるのか分からない(おそらく、データフィールド値を接頭辞としてnameに追加して、それをすべてカスタムコレクションとRegex ..しかし、それはナツィーと思われる)。

data-fieldにアクセスする方法はありますか?このようにして、ビュー内で新しい列を並べ替えたり追加したりするのは壊れません。あなたが作成する場合

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

+0

データを収集するためにモデルを使用しようとしましたか?そうすれば、FormCollection内の項目の順序について多くのことを心配する必要はありません。 –

+0

@Huske - いいえ、私はあなたが何を意味するのか分かりません。リンクの例がありますか、または回答を投稿したいですか? –

+0

そのデータフィールドのサーバー側にアクセスすることはできません。私はここであなたの実際の目標に少しあいまいです。もっと説明できますか? – Mallioch

答えて

1

のは、あなたがこのように定義されたクラス(モデル)を持っているとしましょう:

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

あなたのコントローラ、アクションを呼び出している場合がありますので同様に、作成します。 MyModelをモデルとして使用する厳密に型指定されたビューでは、次のように定義することができます。

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

このフォームを送信すると、Modelバインダーはバックグラウンドで、このフォームのデータをRequest.Formを使用して、バックグラウンドで作成するMyModelタイプのオブジェクトにコピーします。この新しいオブジェクトは、HTTP POSTメソッドを処理するアクションに渡されます。これにより、厳密に型指定されたオブジェクトが得られ、FormCollectionの項目の順序について心配する必要はありません。

私はあなたの質問にお答えしたいと思います。

BTW。私はVisual Studioなしでこれを書いたので、エラーがないことを願っています。 :-)

関連する問題