2013-06-19 1 views
3

У меня есть 2 действия в одном контроллереДублирование акции в одном контроллере с использованием MVC

public ActionResult DoSomething() 
{ 
    ... 
} 

public ActionResult SoSomethingAgain() 
{ 
    ... 
} 

Я хотел бы иметь оба запросов идут к одной и той же акции.

возможно псевдоним ....

[ie. SoSomethingAgain] 
public ActionResult DoSomething() 
{ 
    ... 
} 

Что такое правильный подход?

+0

Не могли бы вы использовать этот атрибут '[ActionName (« SoSomethingAgain »)]' для 'DoSomething' Action Method? –

ответ

2

Если SoSomethingAgain это называется действие, то два предыдущих ответов будет работать код, который находится внутри DoSomething, но действие контроллера и контекст еще SoSomethingAgain. Это означает, что выражение return View() внутри DoSomething будет искать представление SoSomethingAgain.

Аналогичным образом в конвейере будут использоваться фильтры, определенные на SoSomethingAgain, а не на DoSomething. Вы можете увидеть это, если вы установите фильтр [Авторизовать] на DoSomething. Если вы нажмете на действие DoSomething, вам будет предложено войти в систему, но если вы нажмете на действие SoSomethingElse, вам не будет предложено.

Возможно, это то, что вы хотите, может быть, нет. Если это не так, и вы хотите иметь как URL-адрес DoSomething, так и URL-адрес SoSomethingElse, но оба запускают тот же код, затем избавитесь от действия контроллера SoSomethingElse и добавьте настраиваемый маршрут (до маршрута по умолчанию).

routes.MapRoute(
    name: "SoSomethingAgainRoute", 
    url: "{controller}/SoSomethingAgain/{id}", 
    defaults: new { controller = "Home", action = "DoSomething", id = UrlParameter.Optional } 
); 
+0

Ваш ответ сейчас лучший! Именно то, что я искал! – Pinch

5

В SoSomethingAgain просто сделать это:

return DoSomething(); 

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

+0

очень хорошо, вы правы, мне было интересно, будет ли подход, который забирает контроллер? – Pinch

+1

@ Pinch, создавая конкретный «маршрут», отобрал бы контроллер. Вы можете направить 'SoSomethingAgain' на' DoSomething', но я просто говорю, что код больше работает, чем это стоит ** и ** это намного больше ** обфускации ** таким образом. Когда вы пишете код таким образом, разработчику очень легко увидеть, что происходит, а не отлаживать, почему в мире «SoSomethingAgain» даже работает. –

+0

+1 для обучения меня «запутанным» и для отличного объяснения. – Pinch

7

Если я читаю это правильно, вы можете просто сделать:

public ActionResult DoSomething() 
{ 
    ... 
} 

public ActionResult SoSomethingAgain() 
{ 
    return DoSomething(); 
} 
+0

Ха-Майкл типа быстрее меня :) –

+0

очень хорошо, вы правы, мне было интересно, будет ли подход, который забирает контроллер? – Pinch

Смежные вопросы