我正在尝试发回输入字段的内容,如下所示。
@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
属性。没有运气。
答案 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没有任何不同,但我们在项目中使用强类型帮助程序方法,因为它们通过错误输入属性名称来减少导致错误的可能性。
硬类型版本 - 字符串参数用于搜索ViewData
,ViewBag
和视图模型,以查找可用作输入元素基本的相应数据项。所以,例如,如果你打电话
@Html.TextBox("DataValue")
,MVC框架尝试查找与密钥DataValue
对应的某些数据项。系统会检查以下位置:ViewBag.DataValue
和Model.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"]
另请注意,将使用找到的第一个值,终止 搜索。