0

次のアクションを使用して、コンテンツ管理システムの管理者で編集したナビゲーション バー アイテムを保存しています。

    [HttpPost]
    public ActionResult aSaveNavs()
    {
        aLoggedIn();

        NavItemsDataContext navDB = new NavItemsDataContext();
        Nav n = navDB.Navs.Select(row => row.ID == Convert.ToInt32(Request.Form["ID"]));

        n.NavName = Request.Form["NavName"];
        n.NavURL = Request.Form["NavURL"];
        n.NavEnabled = (Request.Form["NavEnabled"] == "true" ? true : false);
        navDB.SubmitChanges();

        return Redirect("/Admin/aHome");
    }

次のビューを使用しています。

@{
List<Nav> navList = HtmlHelpers.GetNavList();
}

@foreach (Nav item in navList)
{
    <tr>
        <td style="width: 150px; text-align: center;">
            @item.NavName
        </td>
        <td style="width: 150px; text-align: center;">
            <input id="NavName" name="NavName" type="text" value="@item.NavName" />
        </td>
        <td style="width: 150px; text-align: center;">
            <input id="NavURL" name="NavURL" type="text" value="@item.NavURL" />
        </td>
        <td>
            <input id="ID" name="ID" type="text" readonly="readonly" value="@item.ID" />
        </td>
    </tr>
}

明らかに、ビューには他にもいくつかのビットがありますが、これが問題のセクションです。

変更を保存しようとすると、「System.FormatException: 入力文字列が正しい形式ではありませんでした」というメッセージが表示されます。次の行が強調表示されます。

Nav n = navDB.Navs.FirstOrDefault(row => row.ID == Convert.ToInt32(Request.Form["ID"]));

これについてご協力いただきありがとうございます。

4

3 に答える 3

4

すでに人々は変換を行う方法とそのエラーを修正する方法に答えました。私は何か他のことについて話します。

SLaksが述べたように、MVCModelBindingの使用を検討することをお勧めします。MVCチームは、私たちの生活をより良くするためにそれを作成しました。したがって、この優れた機能を利用する必要があります。

モデルバインディングは、強く型付けされたビューに依存します。ViewModelそれでは、ビュー用の(単なるクラス)を作成しましょう。

public class NavigationViewModel
{
  public int ID { set;get;}
  public string Name { set;get;}
  public string URL{ set;get;}
  public bool IsEnabled{ set;get;}
}

アクションから、GETこのクラスのオブジェクトを作成し、それをビューに渡します。

public ActionResult aSaveNavs()
{
  NavigationViewModel vm=new NavigationViewModel();
  return View(vm); 
}

次に、ビューを強く型付けされたビューに変更します。

@model NavigationViewModel
@using(Html.BeginForm())
{
  @Html.LabelFor(x=>x.Name) 
  @Html.TextBoxFor(x=>x.Name)

  @Html.LabelFor(x=>x.URL)
  @Html.TextBoxFor(x=>x.URL)

  @Html.LabelFor(x=>x.IsEnabled)
  @Html.CheckBoxFor(x=>x.IsEnabled)

  @Html.HiddenFor(x=>x.ID)
  <input type="submit"  />
}

ここで、POSTアクションで、Model/ViewModelのプロパティからフォーム値を読み取ります

[HttpPost]
public ActionResult aSaveNews(NavigationViewModel model)
{
 if(ModelState.IsValid)
 {
    //Now you will have the Value inside the model Properties
    string name=model.Name;
    string url=model.URL;
    bool isEnabled=model.IsEnabled;

    //now save to your Data base and Redirect (PRG pattern)

 }
 return View(model);
}

また、ビュー内でメソッドを呼び出さないようにしてください(ビュー内で呼び出してGetNavListいます)。そのアプローチ(コードとUIの混合)により、ビューが見苦しくなります。MVCフレームワークの主な目標の1つは、懸念事項の分離です。それでは、UIと機能を分離(そしてクリーン)に保ちましょう。

リストのアクションメソッドを用意し、そこにアイテムを取得して、強く型付けされたビューに渡します。

public ActionResult aHome()
{
  List<Nav> navList = HtmlHelpers.GetNavList();
  return View(navList);
}

そして、ビューをに変更します

@model IEnumerable<Nav>
@foreach (Nav item in navList)
{
  <p>@item.Name</p>      
}

複数のレコードを更新する単一のページがある場合は、EditorTemplatesの使用も検討してください。

于 2012-08-14T14:07:08.010 に答える
2

を使用して文字列をintに変換できるかどうかを確認してくださいint.TryParse

于 2012-08-14T13:44:19.960 に答える
2

Convert.ToInt32 は、空の場合などにエラーをスローする可能性があるため、次を使用します。

int result=0;
Int32.TryParse(Request.Form["ID"].ToString(), out result);

そして、あなたのコードで:

Nav n = navDB.Navs.FirstOrDefault(row => row.ID == result);   
于 2012-08-14T13:49:40.537 に答える