MVC 4 - 在同一页面上返回子细节

时间:2012-11-22 16:37:22

标签: c# asp.net-mvc asp.net-mvc-4

我刚刚进入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用了太长时间了?

1 个答案:

答案 0 :(得分: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,如果它不为空,则在视图中显示。