0

タイプのモデルを取るビューがあります

public class Product
{
    public string PartNumber { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
    public string ImageUrl { get; set; }
    public List<Document> Documents { get; set; }

    public Product()
    {
        Documents = new List<Document>();
    }

}

次のリンクをクリックすると、コントローラーを呼び出して、何らかの方法でリストをパラメーターとしてコントローラーに渡します

 <a href="@Url.Action("Browse", "Home", new { docList= Model.Douments})" data-role="button" data-icon="search" class="my-btn">Available Documents</a>

   public ActionResult Browse(List<Documentr> docList)
        {}

クエリ文字列にリストを渡す必要がない場合は、したくありません。

これを実現するためにコードを修正するためのヘルプを探しています

4

2 に答える 2

0

ViewModel を使用してデータを渡す必要があります (最も簡単な方法)。

または、ここで説明されているように、カスタム アクション フィルターまたはカスタム モデル バインダーを使用して難しい方法で行うこともできます。

試行している方法が機能しない理由は、リストをパラメーターとして渡すことが、デフォルトのモデル バインダーを介して MVC によって適切に処理されないためです。


アップデート

より大きな Product クラスの一部であるリストを使用して投稿を更新するのを見て以来、目的のアクションで ID によって製品を参照しないのはなぜでしょうか? (エンティティ キーの名前はわかりませんが、" Id"であると仮定します。

リンクは次のように変更されます。

<a href="@Url.Action("DocumentList", "Home", new { id = Model.Id})" data-role="button" data-icon="search" class="my-btn">Available Documents</a>

そして、あなたはあなたのアクションを持っているでしょう:

public ActionResult DocumentList ( int id )
{
    var product = db.Product.Find(Id);
    return View(product.List)
}
于 2012-07-23T13:42:03.253 に答える
0

これを複雑にしすぎていると思います。読み取り専用データを別のコントローラー アクションに投稿する理由がわかりません。このアプローチのもう 1 つの問題は、リンクがクリックされるまでに最新でなくなる可能性があることです (わずかな可能性ですが、それでも可能性はあります)。また、最初のビューに実際にドキュメントが表示されない場合は、必要ないためモデルから削除します。

public class ProductViewModel
{
    public int Id { get; set; }
    public string PartNumber { get; set; } 
    public string ShortDescription { get; set; } 
    public string LongDescription { get; set; } 
    public string ImageUrl { get; set; } 
}

public ActionResult Product(int id)
{
    var model = new ProductViewModel();
    ... // populate view model
    return new View(model);
}

次に、ビューで製品にリンクして参照します

@Html.ActionLink("Browse Documents", "Home", "Documents", new { id = Model.Id })

次に、Documentsアクションで製品を再度引っ張り、今度はドキュメントを送信します

public ActionResult Browse(int productId)
{
    var product = ... // get product by id
    return View(product.Documents);
}

一般的な経験則 -ビューに必要なものだけを与える

于 2012-07-23T14:31:59.070 に答える