2012-08-14 194 views
0

我使用了以下行动来拯救一个内容管理系统的管理员编辑的导航栏项目:将字符串转换为int(2)

[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

您需要学习使用MVC模型绑定。 – SLaks 2012-08-14 13:42:43

回答

2

Convert.ToInt32仍可能引发错误为int,例如,当它是空的,所以用这个:

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

,然后在您的代码中:

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

这似乎是有道理的,它让我通过代码段的好,但现在我得到一个NullReferenceException在我的n.NavName行 – 2012-08-14 13:59:41

+1

这意味着** n **为空,换句话说,它没有被发现。尝试使用调试器来检查结果值是否具有期望值,以及它的值是否真的存在于navDB.Navs集合中。 – Allie 2012-08-14 15:00:11

2

尝试检查,如果你可以将字符串中使用int.TryParse

+0

int.TryParse(Request.Form [“ID”])给我一个错误,没有过载方法“TryParse”需要1个参数 – 2012-08-14 13:50:14

+1

这是因为你需要给它一个int对象作为out参数。 http://msdn.microsoft.com/en-us/library/f02979c7.aspx – krillgar 2012-08-14 13:56:49

4

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

正如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视图)。这个appraoch(混合代码和UI)会让你的视图变得丑陋。 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也是一个单页。

+1

谢谢,非常有趣的阅读 – 2012-08-14 14:13:54