名称未指定绑定模型的MVC TextBox

时间:2015-05-20 20:04:31

标签: c# asp.net-mvc html-helper

这就像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>
}

我要发布的网络服务需要输入字段的特定名称才能成功接收数据

同样,渲染的html需要阅读:

<input type="stock_employee_name" type="text" /> 

经过大量的谷歌搜索,我确定我需要使用Html.Text框来控制生成的name属性。

我遇到的问题是,当我提交表单时,我的控制器中的模型完全没有数据。调查此显示表单已发布到服务器,其中&#34; employee_stock_name = Some Name&#34;而不是&#34; EmployeeName = Some Name&#34;

从我的研究来看,这不应该发生,对吗?这种情况应该是您使用TextBox而不是TextBoxFor的原因。

我错过了什么?

这是我的控制器的价值:

[HttpPost]
    public RedirectToRouteResult SimulateForm(StockEnrollmentModel model )
    {
        if ( ModelState.IsValid )
        {
            return RedirectToAction("SignForm", "HR", model);
        }
        return RedirectToAction("StockPurchase", model );
    }

更新

以下接受的答案是我最终使用的答案。没有真正的方法可以轻松更改HTML字段的名称并维护MVC模型绑定。我最终更改了我的属性名称以匹配我需要名称字段来阅读。

3 个答案:

答案 0 :(得分:3)

HtmlHelper.TextBox函数的第一个参数是函数创建的输入元素的name属性。您将“employee_stock_name”指定为该参数(因此也是输入元素的name属性),因此这是通过线路发送的内容。

您应该指定正确的名称:

@Html.TextBox("EmployeeName", Model.EmployeeName)

或使用HtmlHelper.TextBoxFor自动生成它:

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

答案 1 :(得分:0)

如果您确实需要将html呈现为<input name="stock_employee_name" type="text" />,则可以将以下属性添加到模型的属性中:[Bind(Prefix = "stock_employee_name")] - 但这是一个黑客,这听起来像是你的误解在其他地方的要求?为什么输入名称必须是“employee_stock_name”?

答案 2 :(得分:0)

You can change the name of a rendered textbox from @Html.TextBoxFor by passing in the Name parameter to the htmlAttributes object parameter of the helper method.

@Html.TextBoxFor(model => model.EmployeeName, new { Name = "stock_employee_name" })

This will break your model binding when posting back to your controller but at least your name will be right on the form and the data will get filled when creating the form initially.

You can however, use Request.Form["stock_employee_name"] to retrieve the data in your controller's post Action.