2015-05-20 37 views
1

這就像在這裏的MVC 101,所以我覺得完全無助,爲什麼這不起作用。我有一個非常基本的型號:MVC文本框的名字指定不綁定模型在崗位

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框來控制生成的name屬性。

我遇到的問題是,當我提交表單時,我的控制器中的模型完全沒有數據。調查這顯示錶單發佈到服務器與「employee_stock_name =某個名稱」而不是「EmployeeName =某個名稱」

從我的研究,這不應該發生,正確??這種確切的情況應該是您使用TextBox而不是TextBoxFor的原因。

我錯過了什麼?

這裏是我的什麼它的價值控制器:

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

UPDATE

下接受的答案是什麼,我終於結束了使用。沒有真正的方法來輕鬆更改HTML字段的名稱並保持MVC模型綁定。我最終改變了我的屬性名稱以匹配我需要的名稱字段來讀取。

+0

您是否嘗試過使用'@ Html.TextBoxFor'而不是'@ Html.TextBox'與自定義ID? – pasty

+0

我沒有,但如前所述,我要發佈的web服務要求名稱字段具有指定的值 – Icestorm0141

+0

作爲初始值或不應更改的值? – pasty

回答

2

HtmlHelper.TextBox函數的第一個參數是該函數創建的輸入元素的name屬性。您將該參數指定爲「employee_stock_name」(並因此指定爲輸入元素的名稱屬性),以便通過線路發送內容。

您應該指定正確的名稱:

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

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

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

同樣,呈現的html需要讀取。我一直在尋找帖子,儘管呈現的html字段的名稱與模型屬性名稱不同。所以我不認爲這會是一個問題。 Theres導致此功能存在。如果你想命名你的財產PersonId,但有查詢字符串讀取Id =?代替??有了這些限制,我應該能夠做到這一點。爲什麼TextBox會存在,那麼如果傳入一個自定義名稱屬性會破壞模型綁定? – Icestorm0141

+1

您如何期待MVC將'employee_stock_name'映射到'EmployeeName'?爲什麼你希望它是「EmployeeName」,如果它「需要」是「employee_stock_name」供你的web服務讀取它? **編輯:**讓我補充一點:StockEnrollmentModel上的屬性的名稱是什麼,您期望填充該值?此外,您是否也顯示了您提到的Web服務的控制器/操作?或者他們出於某種原因是兩件不同的事情? – Tim

+0

當我已經看到了這個問題上來在我的搜索結果是當你有嵌套模型,並喜歡你的綁定: @ Html.TextBox(「MyPreferedName」,Model.SearchParams.someParam) 如果這個心不是什麼這應該是用來幫助我理解爲什麼上面的代碼(這是發現在這裏:http://stackoverflow.com/questions/6920935/control-name-in-textboxfor-in-mvc3)是什麼不同於我用例? MVC如何知道如何綁定? – Icestorm0141

0

如果你真的需要你的HTML渲染爲<input name="stock_employee_name" type="text" />,你可以添加以下屬性屬於您的模型上的屬性:[Bind(Prefix = "stock_employee_name")] - 但這是一種黑客行爲,聽起來您在其他地方誤解了需求?爲什麼輸入名稱需要是「employee_stock_name」?

+0

Web服務我發佈到有我試圖填補相應的領域。這些字段中的某些名稱很模糊,所以更改我的模型屬性以反映Web服務期望的所有字段並不理想。 – Icestorm0141

+1

對不起,這聽起來像是你需要做的咕嚕咕嚕工作 - 你可能會稍微減輕它的使用能夠理解下劃線情況的自定義模型綁定,但它不會神奇地將stock_employee_name解析爲EmployeeName,而不會有助於推動。 –

0

通過將Name參數傳遞給helper方法的htmlAttributes對象參數,可以更改呈現的文本框的名稱從@Html.TextBoxFor

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

這將打破你的模型回發到控制器的時候,但至少在最初創建表單時,你的名字將是正確的表格,數據將得到填補結合。

但是,您可以使用Request.Form [「stock_employee_name」]來檢索控制器後期操作中的數據。