将字符串转换为int(2)

时间:2012-08-14 13:41:43

标签: c# asp.net-mvc

我正在使用以下操作来保存从内容管理系统管理员编辑的导航栏项目:

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

提前感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:4)

人们已经回答了如何进行转换并修复该错误。我会谈谈其他事情。

正如SLaks所提到的,你最好考虑使用MVC ModelBinding。 MVC团队创造了它,使我们的生活更美好。所以我们应该利用这个不错的功能。

Modelbinding取决于强类型视图。所以让我们为你的视图创建一个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操作中,从我们的模型/ 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);
}

还要尽量避免在View中调用你的方法(你在视图中调用GetNavList)。这个appraoch(混合代码和UI)将使你的View难看。 MVC框架的主要目标之一是关注分离。因此,让我们保持UI和功能分离(和清洁)。

为您的列表提供一个操作方法并获取其中的Items并将其传递给您的强类型视图。

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

将视图更改为

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

如果您有一个页面要更新多个记录,请考虑使用EditorTemplates

答案 1 :(得分:2)

尝试检查,是否可以使用int.TryParse

将字符串转换为int

答案 2 :(得分:2)

Convert.ToInt32可能仍然会抛出错误,例如当它为空时,请使用:

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

然后在你的代码中:

Nav n = navDB.Navs.FirstOrDefault(row => row.ID == result);