2016-08-30 7 views
0

データベースから結果を返すちょっとしたボックスがあります。それはうまく動作します。結果はリストページにあり、正しく表示されます。しかし、私は選択されたオブジェクトを取ってそれを私のコントローラに渡す必要があります。私はそれをデバッグするとNULL値を取得し、空の結果ページです。ここ は、モデルである:ここではリストビューのページから選択したオブジェクトを渡すMVC

public class CodeSnip 
{ 
    public short Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Code { get; set; } 
    public LangType Language { get; set; } 
    public string Creator { get; set; } 

} 

public class ListOfCodeSnips : List<CodeSnip> 
{ 
    public CodeSnip CodeSnip { get; set; } 
} 

public enum LangType 
{ 
    CSharp,     
    css, 
    HTML, 
    JavaScript, 
    Perl, 
    PHP, 
    Python, 
    Ruby, 
    SQL, 
    VB, 
    XML, 
    Other 
} 

は(気圧何もしない)コントローラメソッドである:ここで

[HttpPost] 
    public ActionResult Display(CodeSnip snip) 
    { 
     return View(snip); 
    } 

は、私はビューのために持っているものです。ここでも、オブジェクト値のためだけNULLSポスト:

@model Models.ListOfCodeSnips 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.CodeSnip.Title) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.CodeSnip.Description) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.CodeSnip.Language) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.CodeSnip.Creator) 
     </th> 
    </tr> 

    @using (Html.BeginForm("Display", "Home", FormMethod.Post)) 
    { 


    foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Title) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Language) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Creator) 
     </td> 
     <td> 
      <input type="submit" value ="Display"/> 
     </td> 
    </tr> 
     } 
    } 
</table> 

をので、簡単に言えば、私は何をしたいビューから選択したモデルアイテムを取ると私のコントローラの表示方法にそれを渡しますが、私のようになり言った、私が得るすべてはヌルです。 私は見て回って、私はすべてのオブジェクトのリストを渡す方法の例fを見つけるです。私はそれらと猿を試みたが、何も得られなかった。

お時間をいただきありがとうございます。

+0

計算をしていない場合や、値をdbに保存/変更しようとしていて、代わりに*表示する場合は、 'HttpPost'リクエストではなく' HttpGet'リクエストですか? –

+0

このようなアプローチに利点はありますか?あれば、どうすればいいですか?私はActionLinkで試してもまだオブジェクトを渡すことができませんでした – rigamonk

+0

rigamonk

答えて

1

あなたはActionLinkを試してもうまくいかなかったと言いましたので、それはどのように動作するのですか。あなたが探しているタイプを表示アクションのパラメータとして渡すのではなく、ID記録。

だから、このようなものになります。このことができますなら、私を知ってみましょう

コントローラーアクション

[HttpGet] 
public ActionResult Display(int id) 
{ 
    var snip = db/* connection string */.TableName.Find(id); 
    return View(snip); 
} 

ActionLink

@Html.ActionLink("Display", "Display", "ControllerName", new { id = item.Id }, null) 

// Or if you want a button that acts as a link, and not just a plain link 

<input type="button" class="btn" value="Display" onclick="location.href='@Url.Action("Display", "ControllerName", new { id = item.Id })'" /> 

を!

1)あなたが戻ってコントローラに選択された値を送信する任意の<input>要素をレンダリングしません:

+0

私はそれをやっていましたが、データベースに(かなり安いけど) – rigamonk

+0

@rigamonk大丈夫ですが、ボタンがクリックされたときにURがnull値を取得する理由を説明しています。あなたのコードは表示する*レコードを知りません。空のCodeSnipモデル...各レコードで一意であるため、 'ID'を使う必要があります –

0

はあなたのコードには二つの問題があります。 Html.DisplayForに加えてHtml.HiddenForまたはHtml.EditorForを使用してください。

2)MVC Modelbinderがリストをバインドできるようにするには、foreachの代わりにforループを使用します。

MVC Form submit not transferring the updated model back to action method for List

for (var i = 0; i < Model.Count(); i++) { 
    <tr> 
     <td> 
      @Html.DisplayFor(m => m[i].Title) 
      @Html.HiddenFor(m => m[i].Title) 
     </td> 
     @* etc ... *@ 
    <tr> 
} 

PSを参照:このループはすべてCodeSnipsを表示後になる、すなわち受信動作が署名public ActionResult Display(ListOfCodeSnips postData)を有するであろう。

関連する問題