【问题标题】:Converting string to int (2)将字符串转换为 int (2)
【发布时间】:2012-08-14 22:07:08
【问题描述】:

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

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

提前感谢您对此提供的任何帮助。

【问题讨论】:

  • 你需要学习使用MVC模型绑定。

标签: c# asp.net-mvc


【解决方案1】:

已经有人回答了如何进行转换并修复该错误。我再说点别的。

正如 SLaks 所提到的,您最好考虑使用 MVC ModelBinding。 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 操作中,从我们的模型/视图模型的属性中读取表单值

[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)。这种方法(混合代码和用户界面)会使你的视图变得丑陋。 MVC 框架的主要目标之一是关注点分离。所以让我们保持 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

【讨论】:

    【解决方案2】:

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

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

    然后在你的代码中:

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

    【讨论】:

    • 这似乎是有道理的,它让我通过了那段代码,但现在我在我的 n.NavName 行得到了 NullReferenceException
    • 表示n为空,也就是说没有找到。尝试使用调试器检查结果值是否具有预期值,以及它的值是否确实存在于 navDB.Navs 集合中。
    【解决方案3】:

    尝试检查是否可以使用int.TryParse将字符串转换为int

    【讨论】:

    猜你喜欢
    • 2011-10-02
    • 2011-03-06
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多