在养成一个坏习惯之前需要建议

时间:2010-12-14 18:36:00

标签: asp.net-mvc view controller

我有一个名为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>

他们都继承了同一个模型。

我的问题是,我是否以正确的方式做事?或者这只是一个黑客,我设法凑到一起。在我养成一个坏习惯之前帮助我。

5 个答案:

答案 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的一个特性是视图和控制器是独立的。你可以同样使用共享或部分视图来做同样的事情,如果有什么我会说它是一件好事,因为你正在编写可重用的代码并使用它。