表单中的更改未发送到控制器

时间:2016-01-02 10:17:33

标签: c# asp.net-mvc razor data-binding

我正在尝试发回输入字段的内容,如下所示。

@model Bike
@using (Html.BeginForm("BikeStore", "Home", FormMethod.Post))
{
  <input type="text" value="@Model.Color" />

  <input type="submit" value="Save"/>
  @Html.ActionLink("Cancel", "Bikes", "Home")
}

动作和模型声明如下。

public ActionResult BikeStore(Bike bike)
{
  ...
  return RedirectToAction("Bikes");
}

public partial class Bike
{
  [Key] public Guid Id{get; set;}
  [Required, StringLength(999)] public string Color { get; set; }
}

我在方法BikeStore中遇到了断点,但是传入的bike是空的,即它不是null但是所有的字符串都是,guids是00..00等。

我尝试过不同的变量类型。我还测试了FormMethod.Get和(当然不是同时)添加HttpPost属性。没有运气。

1 个答案:

答案 0 :(得分:2)

Asp.Net MVC绑定系统使用输入元素的名称绑定到适当的属性或参数。所以,改变这一行:

 <input type="text" value="@Model.Color" />

为:

 @Html.TextBoxFor(m => m.Color)

这将生成以下html(例如):

 <input type="text" id="Color" name="Color" value="Black" />

请记住,您可以使用另一个帮助程序来强制键入值的名称:

 @Html.TextBoxFor("Color")

或者,你可以像你一样编写普通的html并添加name属性,但让Asp.Net决定该元素的名称。

<input type = "text" 
    name = "@Html.NameFor(m => m.Color)"
    value = "@Model.Color" />

如果我们想总结答案的结果,那么让我们写下每个版本的优点和缺点:

  • 强类型版本 - 这些帮助程序只能用于强类型视图。这些帮助程序生成的HTML没有任何不同,但我们在项目中使用强类型帮助程序方法,因为它们通过错误输入属性名称来减少导致错误的可能性。

  • 硬类型版本 - 字符串参数用于搜索ViewDataViewBag和视图模型,以查找可用作输入元素基本的相应数据项。所以,例如,如果你打电话 @Html.TextBox("DataValue"),MVC框架尝试查找与密钥DataValue对应的某些数据项。系统会检查以下位置:ViewBag.DataValueModel.DataValue。 找到的第一个值用于设置生成的HTML的value属性。 (@Model.DataValue的最后一项检查仅在视图的视图模型包含名为DataValue的属性或字段时才有效。) 如果我们指定类似DataValue.First.Name的字符串,则搜索会变得更复杂。 MVC框架将尝试不同的点分隔元素排列,例如:

•  ViewBag.DataValue.First.Name
•  ViewBag.DataValue["First"].Name
•  ViewBag.DataValue["First.Name"]
•  ViewBag.DataValue["First"]["Name"]

另请注意,将使用找到的第一个值,终止 搜索。