0

私はMVCをきちんと始めたばかりで、比較的単純だと思った概念に固執しています。

だから、私はある瞬間にコントローラーに投稿するフォームを持っています(これは問題ありません):

コントローラ

public ActionResult TestAction(int productId)
{
    // What to do here... ?
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TestAction(FormCollection values)
{
    // Do work here and return the objects
    return View(Products);
}

意見

@foreach (var product in Model)
            {
                <tr>
                    <td>@product.Provider.Name</td>
                    <td>&pound;@product.MonthlyPremium</td>
                    <td>@Html.ActionLink("More Details", "TestAction", new { productId = product.ProductId })</td>
                    <td>Compare</td>
                </tr>
            }

// I want the singular product details to be displayed here, under the product list... but how?!

ここで、[詳細](ActionLink)をクリックすると、単一のProductオブジェクトの一部である製品の詳細が表示されます。GETからTestActionコントローラーが呼び出されましたが、製品のビューを保持し、単一の製品の詳細を表示するにはどうすればよいですか?この単一の製品をViewBagに割り当てて、そのようにしますか?次に、製品のリストについて、元のリストをキャッシュし、そのキャッシュを使用しますか?

これは私のサイトの非JSバージョン用であるため、ポストバックを介してこれを実行したいと思います。

確かに、これを行うためのより良い方法が必要です、または私はあまりにも長い間ViewStateに悩まされてきましたか?

4

1 に答える 1

1

たとえば、モデルにプロパティを追加し、パラメータbool ViewDetailに対応するアイテムのプロパティをコントローラに設定できます。productId

public ActionResult TestAction(int productId)
{
    // TODO: error checking
    Products.Single(m => m.ProductId == productId).ViewDetail = true;
    return View(Products);
}

そしてそれをあなたのビューに表示します:

var productDetail = Model.SingleOrDefault(m => m.ViewDetail == true);
if (productDetail != null)
{
    // Display product details
}

または、モデルを変更して次のものを含めることもできます。

public class ProductsWithDetailModel
{
    public IEnumerable<Product> Products { get; set; }  // to loop over and display all products
    public Product DetailProduct { get; set; }          // to display product details, if not null
}

次にDetailProduct、パラメータに基づいてを設定しproductId、nullでない場合はビューに表示します。

于 2012-11-22T16:45:59.070 に答える