2009-05-04 95 views
0

創建新視圖並選擇編輯模板時,模板將爲不可編輯的主鍵創建一個文本框。ASP.Net MVC簡單編輯默認模板中的數據

<%=Html.TextBox("CompanyID", Model.CompanyID)%> 

所以,從視圖刪除控制,將導致此問題:這是後到控制器已經在CompanyID = 0,所以沒有編輯會做的集合。 但是,如果我放回要查看的代碼行,發佈集合中的CompanyID具有適當的值。我正在做的很像這個教程: http://www.asp.net/learn/mvc/tutorial-21-vb.aspx,並在那裏(灰色方塊「清單6 - 控制器\ HomeController.vb(編輯方法)」部分上方)它說你可以刪除控件,但它不工作..任何建議?

更新 好了,更多的解釋,在這裏不用2個問題:
問題1在這個代碼:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(ByVal movieToEdit As Movie) As ActionResult 

如果從視圖在movietoedit的movieid刪除MovieID文本框集合總是零,所以從asp.net網站tutortial不會工作!如果我想刪除鑑於movieID,我不得不ID傳遞給我的控制器是這樣的:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(ByVal ID as integer,ByVal movieToEdit As Movie) As ActionResult 

現在我可以用這個型號ID查詢..那是沒有問題的,但它需要我一些時間來搞清楚,正如我一步一步從網站上做的一樣!

問題2所以,怎麼辦在沒有使用movieID的情況下編輯,甚至在隱藏的文本框?
我用這作爲我的控制器:(使用Enity框架)

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(ByVal id As Integer, ByVal collection As Company) As ActionResult 
    If Not ModelState.IsValid Then 
     Return View() 
    End If 

    Try 
     Dim c = _db.CompanySet.FirstOrDefault(Function(m) m.CompanyID = id) 

     If c Is Nothing Then 
      Return RedirectToAction("index") 
     End If 



     _db.ApplyPropertyChanges(c.EntityKey.EntitySetName, collection) 
     _db.SaveChanges() 

     Return RedirectToAction("Index") 
    Catch ex As Exception 
     Throw ex 
    End Try 
End Function 

如果我從我的觀點(文本或隱藏字段)刪除CompanyID它會給我從c.EntityKey.EntitySetName這個錯誤:
ObjectStateManager不包含引用「Companies.Company」類型對象的ObjectStateEntry。
如果我添加類似

<%= Html.TextBox("CompanyName", Model.CompanyName) %> 

它將很好地工作。我很困惑!

注:我檢查代碼的10倍以上,我不知道是否有什麼我做錯了或教程是錯的..

回答

0

如果您傳遞的ID和更新過的UpdateModel具體領域,它應該工作。你最好發表你的編輯方法讓我們看看發生了什麼。下面的例子可以說明我試圖解釋的過程。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Page page = repo.GetPage(id); // returns page with specific id 
    UpdateModel(page); // updates page with new form values 
    repo.Save(); // saving all the changes 
    return RedirectToAction("Details", new { id = page.id }); 

} 
+0

請看這個問題,它在我的情況下更新 – mohamadreza 2009-05-05 10:04:35

2

該教程是正確的,你不應該離開一個文本框與ID,我認爲他們正在承擔的ID是你的路線的一部分,像/電影/編輯/ 1。如果不是這種情況,您可以使用路線集合將其添加到表單操作中,或者在表單中添加隱藏字段。

添加ID到編輯的作用路線:

<% using (Html.BeginForm("Edit", "Controller", 
       new {id = Model.Id}, FormMethod.Post)) 
    { %> 

或者一個隱藏字段:

<%=Html.Hidden("CompanyID", Model.CompanyID)%> 
+0

不需要html.beginform值,因爲它是這樣的:

already,and i不想使用隱藏的字段,有什麼辦法嗎? – mohamadreza 2009-05-05 09:58:36

0

試試這個方法:

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Edit(<Bind(Exclude:="Id")> ByVal movieToEdit As Movie) As ActionResult 

有關ASP的更多信息.Net MVC,請參閱http://asp.net/learn/mvc