我有一个名为AuctionsController的控制器。在其中我有一些名为Index()和AuctionCategoryListing()的动作:
//Used for displaying all auctions.
public ActionResult Index()
{
AuctionRepository auctionRepo = new AuctionRepository();
var auctions = auctionRepo.FindAllAuctions();
return View(auctions);
}
//Used for displaying auctions for a single category.
public ActionResult AuctionCategoryListing(string categoryName)
{
AuctionRepository auctionRepo = new AuctionRepository();
var auctions = auctionRepo.FindAllAuctions()
.Where(c => c.Subcategory.Category.Name == categoryName);
return View("Index", auctions);
}
正如你所知,他们都调用相同的视图(这个动作叫做'调用一个视图'。它的名称是什么?)。
@model IEnumerable<Cumavi.Models.Auction>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th></th>
<th>
IDSubcategory
</th>
<th>
IDCity
</th>
<th>
IDPerson
</th>
<th>
Title
</th>
<th>
TextBody
</th>
<th>
ContactNumber
</th>
<th>
AskingPrice
</th>
<th>
AddressDirection
</th>
<th>
LatestUpdateDate
</th>
<th>
VisitCount
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
<td>
@item.IDSubcategory
</td>
<td>
@item.IDCity
</td>
<td>
@item.IDPerson
</td>
<td>
@item.Title
</td>
<td>
@item.TextBody
</td>
<td>
@item.ContactNumber
</td>
<td>
@String.Format("{0:F}", item.AskingPrice)
</td>
<td>
@item.AddressDirection
</td>
<td>
@String.Format("{0:g}", item.LatestUpdateDate)
</td>
<td>
@item.VisitCount
</td>
</tr>
}
</table>
他们都继承了同一个模型。
我的问题是,我是否以正确的方式做事?或者这只是一个黑客,我设法凑到一起。在我养成一个坏习惯之前帮助我。
答案 0 :(得分:3)
我将其修改为:
public ActionResult Index(string categoryName)
{
AuctionRepository auctionRepo = new AuctionRepository();
var auctions=auctionRepo.FindAllAuctions();
if (!string.IsNullOrEmpty(categoryName))
{
auctions = auctions.Where(c => c.Subcategory.Category.Name == categoryName);
}
return View(auctions);
}
您的路线可能如下所示:
context.MapRoute(
"auction_defalt",
"Auction/{categoryName}",
new { controller="Auction", action = "Index", categoryName = UrlParameter.Optional }
由于行动非常相似,我认为没有理由将它们分开。
答案 1 :(得分:2)
与任何框架一样,ASP.NET MVC为您提供了大量机会让您自己动手。毫无疑问,重用控制器动作,视图模型和视图很快就会成为维护的噩梦。更不用说没有类似的考虑,你的路线将变得难以捆绑在一起。
遵循约定优于配置的原则,您可以通过使用单独的操作但重用视图部分来解决您的问题。对我来说,AuctionsController
的索引操作应该负责列出系统中的所有拍卖。我不会调用我的类别操作AuctionCategoryListing
,而是简单地称之为Category
。通过惯例,这可以很好地布置路线:
site.com/auctions/
索引site.com/auctions/category/CATEGORYNAME
用于该类别。用户可以轻松理解该路线,并且您可以轻松明白每个路线的用途。 (到目前为止,Omar提供a good suggestion in his answer让您的存储库处理分页,过滤等。)
就每个动作应返回的内容而言,您有几种选择。我的偏好是返回单独的视图,每个视图包含对公共部分的引用。这使您可以灵活地创建围绕部分的不同视图,但可以为常用的部分提供重用。
进一步阅读可能有所帮助:
答案 2 :(得分:1)
你必须在某个地方进行分支,所以这可能更像是一个偏好问题。
我处理它的方法是使用单个方法,并将类别名称作为参数。由于字符串可以为空,如果未指定,则为null。我的一个动作方法可能看起来像:
public ActionResult Index(string categoryName)
{
AuctionRepository auctionRepo = new AuctionRepository();
var auctions = auctionRepo.FindAllAuctions();
if(String.IsNullOrEmpty(categoryName) == false)
auctions = auctions.Where(c => c.Subcategory.Category.Name == categoryName);
return View(auctions);
}
答案 3 :(得分:0)
我希望repo能够为性能和DRY概念做过滤和分页等事情
public ActionResult Index(string categoryName)
{
AuctionRepository auctionRepo = new AuctionRepository();
//Let the Repo Handle things like filtering and pagination, avoiding performance issues
var auctions = auctionRepo.FindAllAuctions(categoryName);
return View(auctions);
}
DAL应该负责这项任务。
答案 4 :(得分:-1)
MVC的一个特性是视图和控制器是独立的。你可以同样使用共享或部分视图来做同样的事情,如果有什么我会说它是一件好事,因为你正在编写可重用的代码并使用它。