Нужен совет, прежде чем я выработаю вредную привычку - PullRequest
6 голосов
/ 14 декабря 2010

У меня есть контроллер под названием 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 ]

3 голосов
/ 14 декабря 2010

Я бы изменил это на:

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 }

Поскольку действия очень похожи, я не вижу смысла их разделять.

2 голосов
/ 14 декабря 2010

Как и любой фреймворк, ASP.NET MVC дает вам множество возможностей выстрелить себе в ногу. Без предварительного обдумывания повторное использование действий контроллера, моделей представлений и представлений может быстро превратиться в кошмар обслуживания. Не говоря уже о том, что без подобного рассмотрения ваши маршруты станут трудно связывать.

Следуя принципам соглашения о конфигурации, вы можете решить свою проблему, используя отдельные действия, но повторно используя частичное представление. Для меня действие индекса AuctionsController должно отвечать за перечисление всех Аукционов в системе. Я бы не назвал действие моей категории AuctionCategoryListing, но вместо этого назвал бы его просто Category. Благодаря соглашению это имеет приятный эффект от разметки маршрутов:

  • site.com/auctions/ для индекса
  • site.com/auctions/category/CATEGORYNAME для категории.

Маршрут понятен пользователю и позволяет вам четко понять, что каждый из них делает. (К этому моменту Омар дает хорошее предложение в своем ответе , чтобы позволить вашему хранилищу обрабатывать нумерацию страниц, фильтрацию и т. Д.)

Что касается того, что должно возвращать каждое действие, у вас есть несколько вариантов. Я предпочел бы вернуть отдельные представления, каждое из которых содержит ссылку на общий частичный. Это дает вам гибкость при создании различных видов, окружающих частичную, но обеспечивает повторное использование для общей части.

Дальнейшее чтение, которое может быть полезным:

1 голос
/ 14 декабря 2010

Вы должны выполнить ветвление где-нибудь, так что, вероятно, это больше вопрос предпочтения.

Я бы решил, что это единственный метод, и он принимает имя категории как параметр.Поскольку строки могут быть обнуляемыми, если они не указаны, они будут нулевыми.Мой метод с одним действием, вероятно, будет выглядеть примерно так:

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);
}
0 голосов
/ 14 декабря 2010

Я бы предпочел, чтобы репо выполняло такие вещи, как фильтрация и разбиение на страницы для повышения производительности и концепции 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 должен отвечать за эти задачи.

0 голосов
/ 14 декабря 2010

Это особенность MVC, что представление и контроллер независимы.Вы можете в равной степени использовать общие или частичные представления для одной и той же вещи, если я скажу, что это хорошо, потому что вы пишете код многократного использования и используете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...