post 上指定名称的 MVC TextBox 未绑定模型
MVC TextBox with name specified not binding model on post
这就像这里的 MVC 101,所以我对为什么它不起作用感到完全无助。我有一个非常基本的模型:
public class StockEnrollmentModel
{
[Required]
[DisplayName("Employee Name:")]
public string EmployeeName { get; set; }
}
我的观点是这样的:
@using (Html.BeginForm("SimulateForm", "HR", FormMethod.Post))
{
<div class="row">
<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(e => e.EmployeeName)
@Html.TextBox("stock_employee_name", Model.EmployeeName)
</div>
</div>
</div>
<button type="submit" class="btn btn-primary" value="Submit">Submit</button>
}
我将发布到的 Web 服务需要输入字段的特定名称才能成功接收数据
如中,呈现的html需要读取:
<input type="stock_employee_name" type="text" />
经过多次谷歌搜索,我确定我需要使用 Html.Text 框来控制生成的名称属性。
我遇到的问题是,当我提交表单时,我的控制器中的模型完全没有数据。对此进行调查表明,使用 "employee_stock_name=Some Name" 而不是 "EmployeeName=Some Name"
将表单发布到服务器
根据我的研究,这不应该发生,对吗?这种确切的情况应该是您使用 TextBox 而不是 TextBoxFor 的原因。
我错过了什么?
这是我的控制器的价值:
[HttpPost]
public RedirectToRouteResult SimulateForm(StockEnrollmentModel model )
{
if ( ModelState.IsValid )
{
return RedirectToAction("SignForm", "HR", model);
}
return RedirectToAction("StockPurchase", model );
}
更新
下面接受的答案是我最终使用的。没有真正的方法可以轻松更改 HTML 字段的名称并维护 MVC 模型绑定。我最终更改了我的 属性 名称以匹配我需要读取的名称字段。
HtmlHelper.TextBox
函数的第一个参数是函数创建的输入元素的名称属性。您将 "employee_stock_name" 指定为该参数(并因此指定为输入元素的名称属性),因此这就是通过线路发送的内容。
您应该指定正确的名称:
@Html.TextBox("EmployeeName", Model.EmployeeName)
或使用HtmlHelper.TextBoxFor
自动生成:
@Html.TextBoxFor(m => m.EmployeeName)
如果您确实需要将 html 呈现为 <input name="stock_employee_name" type="text" />
,您可以将以下属性添加到模型的 属性 中:[Bind(Prefix = "stock_employee_name")]
- 但是这是 hack,听起来你误解了其他地方的要求?为什么输入名称需要是"employee_stock_name"?
您可以通过将 Name 参数传递给辅助方法的 htmlAttributes 对象参数来更改呈现的文本框的名称 @Html.TextBoxFor
。
@Html.TextBoxFor(model => model.EmployeeName, new { Name = "stock_employee_name" })
这会在 post 返回您的控制器时破坏您的模型绑定,但至少您的名字将正确显示在表单上,并且数据将在最初创建表单时得到填充。
但是,您可以使用 Request.Form["stock_employee_name"] 在控制器的 post 操作中检索数据。
这就像这里的 MVC 101,所以我对为什么它不起作用感到完全无助。我有一个非常基本的模型:
public class StockEnrollmentModel
{
[Required]
[DisplayName("Employee Name:")]
public string EmployeeName { get; set; }
}
我的观点是这样的:
@using (Html.BeginForm("SimulateForm", "HR", FormMethod.Post))
{
<div class="row">
<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(e => e.EmployeeName)
@Html.TextBox("stock_employee_name", Model.EmployeeName)
</div>
</div>
</div>
<button type="submit" class="btn btn-primary" value="Submit">Submit</button>
}
我将发布到的 Web 服务需要输入字段的特定名称才能成功接收数据
如中,呈现的html需要读取:
<input type="stock_employee_name" type="text" />
经过多次谷歌搜索,我确定我需要使用 Html.Text 框来控制生成的名称属性。
我遇到的问题是,当我提交表单时,我的控制器中的模型完全没有数据。对此进行调查表明,使用 "employee_stock_name=Some Name" 而不是 "EmployeeName=Some Name"
将表单发布到服务器根据我的研究,这不应该发生,对吗?这种确切的情况应该是您使用 TextBox 而不是 TextBoxFor 的原因。
我错过了什么?
这是我的控制器的价值:
[HttpPost]
public RedirectToRouteResult SimulateForm(StockEnrollmentModel model )
{
if ( ModelState.IsValid )
{
return RedirectToAction("SignForm", "HR", model);
}
return RedirectToAction("StockPurchase", model );
}
更新
下面接受的答案是我最终使用的。没有真正的方法可以轻松更改 HTML 字段的名称并维护 MVC 模型绑定。我最终更改了我的 属性 名称以匹配我需要读取的名称字段。
HtmlHelper.TextBox
函数的第一个参数是函数创建的输入元素的名称属性。您将 "employee_stock_name" 指定为该参数(并因此指定为输入元素的名称属性),因此这就是通过线路发送的内容。
您应该指定正确的名称:
@Html.TextBox("EmployeeName", Model.EmployeeName)
或使用HtmlHelper.TextBoxFor
自动生成:
@Html.TextBoxFor(m => m.EmployeeName)
如果您确实需要将 html 呈现为 <input name="stock_employee_name" type="text" />
,您可以将以下属性添加到模型的 属性 中:[Bind(Prefix = "stock_employee_name")]
- 但是这是 hack,听起来你误解了其他地方的要求?为什么输入名称需要是"employee_stock_name"?
您可以通过将 Name 参数传递给辅助方法的 htmlAttributes 对象参数来更改呈现的文本框的名称 @Html.TextBoxFor
。
@Html.TextBoxFor(model => model.EmployeeName, new { Name = "stock_employee_name" })
这会在 post 返回您的控制器时破坏您的模型绑定,但至少您的名字将正确显示在表单上,并且数据将在最初创建表单时得到填充。
但是,您可以使用 Request.Form["stock_employee_name"] 在控制器的 post 操作中检索数据。