我刚刚进入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>£@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用了太长时间了?
答案 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
,如果它不为空,则在视图中显示。