2017-03-22 39 views
1

我正在使用MVC爲我的ViewModel創建標準的創建/編輯表單。儘管我可以看到ID設置爲10004的DOM元素瀏覽器(& Web UI),但我的創建工作非常好,現在我進入了我的編輯窗體,並且ViewModel的ID被傳遞爲0。所有的字段到我的[HttpPost]編輯控制器的方法,但ID仍然是0.任何想法?MVC:爲什麼我的編輯控制器方法沒有收到我的ViewModel的ID?

下面是我的代碼片段(我有太多的字段等發佈一切,所有其他領域都正確地通過)。

在此先感謝!

視圖模型

public class Header_VM 
    {   
     [DisplayName("Contract ID")] 
     public int Contract_Key { get; set; } 

     etc 
    } 

查看

@model (root).Header.Header_VM 

@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Edit Header: @Model.Name</h2> 

@using (Html.BeginForm("Edit", "Header", FormMethod.Post, new { name = "EditForm" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal" ng-app="HeaderApp"> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Contract_Key, htmlAttributes: new { @class = "control-label col-md-2" }) 
      @Html.DisplayFor(model => model.Contract_Key) 
     </div> 
     etc... 
    </div> 
} 

我對 「INT NEWID ......」 一個破發點,並在該點Contract_Key爲0

控制器

[HttpPost] 
public ActionResult Edit([Bind(Include = "Contract_Key, etc...")] Header_VM header) 
{ 
    int NewID = DB.Header_Insert(header); 
    return RedirectToAction("Details", "Header", new { Contract_Key = NewID }); 
} 
+0

您尚未創建'Contract_Key'('DisplayFor()'只是創建文本,而不是輸入) –

+0

是的,因爲一個表單控件的一個ID。用戶不允許編輯該字段。 – swallis1

+0

如果您從未將它發送給控制器,則您的控制器無法設置該屬性! (如果你沒有創建關聯的控件,爲什麼使用'LabelFor()')。你需要一個隱藏的輸入,或者更好的做法,把這個值作爲路由參數 –

回答

2

DisplayFor的輔助方法生成的HTML標記顯示屬性值。因此,如果您檢查頁面源(查看源),您將看到Contract_Key屬性的label標記的標記。當您提交表單,只有輸入表單字段值被提交,沒有標籤/ DIV值

您需要設置爲"Contract_Key" name屬性值表單內的輸入表單字段。

您可以使用HiddenFor幫助器方法,該方法生成一個隱藏的輸入元素,其name屬性值與屬性名稱匹配。

@Html.DisplayFor(model => model.Contract_Key) 
@Html.HiddenFor(model => model.Contract_Key) 

或者乾脆手寫隱藏輸入

<input type="hidden" name="Contract_Key" value="@Model.Contract_Key" /> 
+1

這樣工作!謝謝! – swallis1

相關問題