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 所提到的,您最好考虑使用 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视图中调用)。这种方法(混合代码和 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

于 2012-08-14T14:07:08.010 回答
2

尝试检查,如果您可以使用将字符串转换为 intint.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 回答