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

本文关键字:控制器 表单 | 更新日期: 2023-09-27 18:28:46

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

@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为空,即它不为空,但所有字符串都是,guid 为 00..00 等。

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

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

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 的值属性。(对于 @Model.DataValue,最后一个检查仅在视图的视图模型包含名为 DataValue 的属性或字段时才有效。如果我们指定一个字符串,如 DataValue.First.Name ,搜索变得更加复杂。MVC 框架将尝试点分隔元素的不同排列方式,如下所示:

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

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