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 操作中检索数据。