2012-02-29 14 views
0

MVC-Viewmodel EFモデルを使用しています。ビューに2つのフォームを作成しようとしています(CREATE用とDELETE用)。 しかし、私はそれが仕事を得るカント...私はこのエラーを取得する:MVC:コントローラ内の他の領域からビューのbeginformへの呼び出し

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sname'. 

私はドロップダウンリストのための私のDeleteSubjectTypeにこのコードを持っており、その2つの形態を使用してイムので、そこに仮定beacuseこの問題が発生したと思います。どういうわけか、私のフォームで動作しているDeleteSubjectTypeの動作です。

誰かが私のコードを見てみることができれば、私は感謝:

これは私が私の見解のbeginformsで使用したい私の行動と私のコントローラです:

public ActionResult CreateSubjectType() 
{ 
    CreateViewModel model = new CreateViewModel(); 
    return View(model); 
} 
[HttpPost] 
public ActionResult CreateSubjectType(CreateViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     SubjectType s = new SubjectType(); 
     s.Sname = model.Sname2;        
     Arep.addsubject(s); 
     Arep.save(); 
     return RedirectToAction("CreateSubjectType"); 
    } 
    return View(model); 
} 


public ActionResult DeleteSubjectType(int id) 
{ 
    CreateViewModel model = new CreateViewModel(); 
    List<SubjectType> subjectypes = Arep.getallS(); 
    model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname"); 

    SubjectType SubjectTypeToDelete = Arep.getbysid(id); 
    return View(model); 
} 

[HttpPost] 
public ActionResult DeleteConfirmed2(int id) 
{ 
    SubjectType SubjectTypeToDelete = Arep.getbysid(id); 
    Arep.DeletSubjects(SubjectTypeToDelete); 
    Arep.save(); 
    return RedirectToAction("Index"); 

} 

は、これが私の見解です。

@model NKI3.ViewModels.CreateViewModel 
@using (Html.BeginForm("CreateSubjectType","Admin",FormMethod.Post)) 
{ 

    @Html.ValidationSummary(true) 
     <fieldset> 
     <legend>Skapa ny utvärderingsobjekt</legend> 
     <div class="editor-label"> 
     @Html.LabelFor(model => model.Sname2, "Välj ny utvärderingsobjekt") 
     </div> 
     <div class="editor-field"> 
     @Html.EditorFor(model => model.Sname2) 
     @Html.ValidationMessageFor(model => model.Sname2) 
     </div> 
     <p> 
     <input type="submit" value="Lägg till" /> 
     </p> 
     </fieldset> 

    } 
     @using (Html.BeginForm("DeleteSubjectType","Admin",FormMethod.Post)) 
     { 

      <fieldset> 
      <legend>Ta bort utvärderingsobjekt</legend> 
      <div class="editor-label"> 
      @Html.LabelFor(model => model.Sname, "Befintliga Utvärderingsobjekt") 
      </div> 
      <div class="editor-field"> 
      @Html.DropDownListFor(f => f.Sname, Model.SubjectTypes) 
      @Html.ValidationMessageFor(model => model.Sname) 
      </div> 
      <p> 
      <input type="submit" value="Ta bort" /> 
      </p>  
      </fieldset> 
     } 

    <div> 
     @Html.ActionLink("Tillbaka", "Index") 
    </div> 

ありがとうございます!

+1

あなたはそれがうまくいかないということを意味しますか?それはあまりにも漠然としており、働きたくない人たちにはあまり魅力的ではありません。 –

+0

私の投稿を編集しました – Obsivus

答えて

1

あなたの質問から、あなたが示した2つのGETアクションのうち、CreateSubjectTypeアクションかDeleteSubjectTypeアクションが関連しているかどうかはわかりません。それともあなたが見せなかった何か他の行為?

CreateSubjectType.cshtmlであると考えられる場合、このビューではSnameプロパティの削除フォームにドロップダウンリストを作成しようとしているため、問題があります。あなたのCreateSubjectTypeでは、DeleteSubjectTypeアクションで行ったように、ビューモデルのSubjectTypesプロパティをSelectListに初期化したことはありません。

ですから、適切にこのプロパティを初期化していることを確認してください:私が見るあなたのコントローラ上の点を除いて

@using (Html.BeginForm("DeleteSubjectType","Admin",FormMethod.Post)) 

public ActionResult CreateSubjectType() 
{ 
    CreateViewModel model = new CreateViewModel(); 
    List<SubjectType> subjectypes = Arep.getallS(); 
    model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname"); 
    return View(model); 
} 

また、あなたの削除フォームはDeleteSubjectTypeアクションに掲載されているようだ

[HttpPost] 
public ActionResult DeleteConfirmed2(int id) 

の代わりに、

[HttpPost] 
public ActionResult DeleteSubjectType(int id) 

同じ名前のGETアクションで発生したオーバーロードの解決の競合を避けるために強制されたと思います。この場合、あなたはこれを行うことができます:

[HttpPost] 
public ActionResult DeleteSubjectType(int id, FormCollection fc) 
+0

それはCreateSubjectType.Cshtmlです。私がDeletSubjectTypeに入力した理由は、ユーザーが値を選択して削除する必要があり、作成アクションとは関係がありません。ここで間違っている? – Obsivus

+0

私のビューモデルのsubjectypesプロパティをSelectListに初期化しようとしましたが、DELETE POSTで何をするのかわかりません。両方のフォームをCreateSubjectType.cshtmlビューで使用したいので、 – Obsivus

+0

@RammtinAvar、私はドンしません。あなたの質問を理解していない。 DELETE POSTの問題点は何ですか?私の答えで説明したとおりに名前を変更するか、Html.BeginFormヘルパーを修正して正しいアクション名を指すようにしてください。また、 'Index'にリダイレクトされているようですが、あなたのコントローラにIndexアクションが表示されません。たぶん、あなたは 'CreateSubjectType'へのリダイレクトを意味しましたか? –

0

私はMVCを少し誤解していると思います。あなたが取得しているエラーは、このライン上で起こっている:

@Html.DropDownListFor(f => f.Sname, Model.SubjectTypes) 

そしてその理由は、ビューをレンダリングしているときにModel.SubjectTypesを移入していないということです。そこで、システムがあなたのコードをどのように解釈するかを説明します:

アクション "CreateSubjectType"のためにコントローラに要求があります。モデルを新しいCreateViewModelに設定し、リストしたビューを返します。ビューがレンダリングされるとき、Model.CreateSubjectTypeはnullです。私が上に示した線にブレークポイントをデバッグして置くことができます。あなたがドロップダウン作業をする必要があることは、あなたのCreateSubjectTypeの行動に次の2行を移動している:あなたは今それを持って

List<SubjectType> subjectypes = Arep.getallS(); 
model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname"); 

方法あなたが削除フォームをPOSTたら、このアクションは実行されます。

+0

あなたのコードには他にも問題があると思いますが、あなたが投稿した問題を解決します。私はいくつかのMVCチュートリアルをゆっくりと体系的に歩き、あなたが他の人に教えることができると感じるまですべてのものを快適にすることをお勧めします。 – Milimetric

関連する問題