Как я могу разделить логику контроллера в ASP.NET MVC для 2 контроллеров, где они переопределены - PullRequest
0 голосов
/ 16 февраля 2010

Я пытаюсь реализовать удобные для пользователя URL-адреса, сохраняя при этом существующие маршруты, и смог сделать это с помощью тега ActionName поверх моего контроллера ( Можно ли перегрузить методы контроллера в ASP.NET MVC? )

У меня есть 2 контроллера:

ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName) { ... }

public ActionResult Index(long id) { ... }

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

Если пользователь вводит URL / Project / TopSecretProject / , вызывается действие UserFriendlyProjectIndex . Я выполняю поиск в базе данных и, если все получится, я хочу применить ту же логику, которая используется в действии Index.

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

Есть предложения?

Я попробовал следующее, и я вижу сообщение об ошибке «Не удается найти»:

[ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName)
{
    var filteredProjectName = projectName.EscapeString().Trim();

    if (string.IsNullOrEmpty(filteredProjectName))
        return RedirectToAction("PageNotFound", "Error");

    using (var db = new PIMPEntities())
    {
        var project = db.Project.Where(p => p.UserFriendlyUrl == filteredProjectName).FirstOrDefault();
        if (project == null)
            return RedirectToAction("PageNotFound", "Error");

        return View(Index(project.ProjectId));
    }
}

Вот сообщение об ошибке:

The view 'UserFriendlyProjectIndex' or its master could not be found. The following locations were searched:
~/Views/Project/UserFriendlyProjectIndex.aspx
~/Views/Project/UserFriendlyProjectIndex.ascx
~/Views/Shared/UserFriendlyProjectIndex.aspx
~/Views/Shared/UserFriendlyProjectIndex.ascx
Project\UserFriendlyProjectIndex.spark
Shared\UserFriendlyProjectIndex.spark

Я использую SparkViewEngine в качестве движка просмотра и LINQ-to-Entities, если это поможет. спасибо!

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

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

ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName) 
{ 
    //...
    //var project = ...;
    return IndexView(project);
}

public ActionResult Index(long id) 
{
    //...
    //var project = ...;
    return IndexView(project);
}

private ViewResult IndexView(Project project) 
{
    //...
    return View("Index", project);
}
0 голосов
/ 16 февраля 2010

Извините, похоже, я отвечаю на свой вопрос!

Я возвратил вызов к контроллеру индекса внутри моего контроллера «обертки», а затем указал имя представления в контроллере индекса.

ActionName("UserFriendlyProjectIndex")]
public ActionResult Index(string projectName) 
{ 
    //...
    //var project = ...;
    return Index(project.ProjectId);
}

public ActionResult Index(long id) 
{
    //...
    return View("Index", project);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...