2009-05-04 13 views
0

から編集します。新しいビューを作成し、テンプレートの編集を選択すると、テンプレートは編集不可能な主キー用のテキストボックスを作成します。企業ID = 0は、そう何の編集は行われませんしたコントローラにポストされ、コレクション:ASP.Net MVC単純なデータをデフォルトテンプレート

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

ので、ビューからコントロールを削除、問題が発生します。 しかし、そのコード行を表示すると、投稿されたコレクションのCompanyIDに適切な値が設定されます。私はこのチュートリアルのようにやっています: http://www.asp.net/learn/mvc/tutorial-21-vb.aspxとそこにある(リスト6 - Controllers \ HomeController.vb(Edit methods)セクションの上のグレーのボックス)、コントロールを削除することができますが、 ?

更新 [OK]を、より多くの説明のために、ここでは2つの問題行く:このコードで
問題1

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

ビュー movietoeditでMOVIEIDからMOVIEIDテキストボックスを削除する場合をコレクションは常にゼロであるので、asp.netウェブサイトの教科書はうまくいきません!私はビューからMOVIEIDを削除したい場合は、私はこのように私のコントローラにIDを渡す必要があります:

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

今私は...何の問題のthatsませんが、それはいくつかの回に私を取り、このIDを使用してモデルを照会することができます私がウェブサイトからステップバイステップで行っていたように、考え出した!

問題2だから、どのようにでも隠されたテキストボックスに、ビューのMOVIEIDを使用せずに編集を行うには?
私は私のコントローラとしてこれを使用しています:

<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 

(Enityフレームワークを使用して)そして、私は私のビュー(テキストボックスまたは隠しフィールド)から企業IDを削除した場合、それはc.EntityKey.EntitySetNameから私は、このエラーを与える:
ObjectStateManagerには、 'Companies.Company'タイプのオブジェクトへの参照を含むObjectStateEntryが含まれていません。
と私は

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

のようなものを追加する場合、それは正常に動作します..私は混乱しています!

注:IDを渡すとのUpdateModelを介して特定のフィールドを更新する場合は、...

答えて

0

を、私は、コードに10回以上チェックし、そこに私が間違っているのは何があるかのチュートリアルが間違っている場合、私は疑問に思いますそれは動作するはずです。あなたは何が起こっているかを見せるためにEditメソッドを投稿する方がよいでしょう。以下の例は私が説明しようとしたプロセスを説明するかもしれない。

[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

2

チュートリアルは右である、あなたは、IDとテキストボックスを残すべきではない、私は彼らが映画/編集/ 1 /のように、idはあなたのルートの一部であると仮定していると思います。そうでない場合は、ルートコレクションを使用してフォームアクションに追加するか、フォームに隠しフィールドを追加することができます。

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

または非表示フィールド:

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

という質問が表示されますので、html.beginformの値は必要ありません:

隠されたフィールドを使用したくない、何か方法はありますか? – mohamadreza

0

この方法を試してみてください:

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

ASPの詳細についてはeditアクションのルートにIDを追加する

.Net MVC、http://asp.net/learn/mvc