2012-08-14 125 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