2010-01-08 3 views
30

Используя предоставленный по умолчанию маршрут, я вынужден назвать мои параметры «id». Это отлично подходит для многих моих действий с контроллером, но я хочу использовать несколько лучших имен переменных в определенных местах. Есть ли какой-то атрибут, который я могу использовать, чтобы иметь более значимые имена переменных в моих сигнатурах действия?Действие Параметр Именование

// Default Route: 
routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

// Action Signature: 
public ActionResult ByAlias(string alias) 
{ 
    // Because the route specifies "id" and this action takes an "alias", nothing is bound 
} 

ответ

48

Используйте [Bind] атрибут:

public ActionResult ByAlias([Bind(Prefix = "id")] string alias) { 
    // your code here 
} 
+1

Это лучший пример использования Bind, который я нашел еще! Есть ли способ сделать эту работу над свойствами модели? то есть вместо сигнатуры метода, имеющей строковый параметр, он имеет класс как параметр, который имеет свойство, которое выглядит следующим образом: '[Bind (Prefix =" id ")] string Alias ​​{get; установить;} '? Этот пример не компилируется ... как мне его изменить для компиляции (а также работы)? –

0

Это все еще работает, строка запроса будет только выглядеть как "/ Controller/ByAlias? Alias ​​= что-то".

+0

Я думаю, вы хотите сказать, что он по-прежнему работает смысл, если я на самом деле использовали Html.ActionLink для создайте мою ссылку, тогда она создаст URL-адрес, как вы описали ... что если я этого не сделал и просто ударил URL/Controller/ByAlias ​​/ aliashere - могу ли я каким-то образом связать параметр псевдонима строки с " id ", определенной в маршруте? – Langdon

+0

В моей версии MVC это не сработало. Он строго ожидал/{id} - не мог предоставить? Alias ​​= val – mmcrae

0

Вы можете настроить маршруты с любыми идентификаторами вам нравится ..

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{alias}",       // URL with parameters 
    new { controller = "Home", action = "Index", alias = "" } // Parameter defaults 
); 

Edit:Here's an overview from the ASP.NET site

+0

Я уверен, что может, но если я все еще хочу, чтобы исходный/Home/Index/id работал, я не могу точно определить/Home/Index/alias right после этого и ожидать, что это когда-нибудь попадет. – Langdon

0

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

Например, если этот метод управления ...

public Controller MailerController 
{ 
    public ActionResult Details(int mailerID) 
    { 
     ... 
     return View(new { id = mailerID }); 
    } 
} 

... и этот способ действия вызова с точки зрения ...

<%= Html.ActionLink("More Info", "Details", new { mailerID = 7 }) %> 

... Вы можете использовать любое именование соглашение, которое вы хотите для параметра ID в методах действий вашего контроллера. Все, что вам нужно сделать, это разрешить новое имя по умолчанию, будь то «id», «alias» или что-то еще.

В приведенном выше примере следует принять решение:

<a href="/Mailer/Details/7">More Info</a> 
+2

Для меня (в MVC 1.0) mailerID всегда будет иметь значение null, если я попаду/Mailer/Details/7. Как только я изменяю int mailerID на int id (согласно Маршруту), он отлично работает. – Langdon

+3

с помощью 'id' позволяет вам обобщать ваши маршруты. Без этого вам понадобится один маршрут для каждой именованной вариации id. –

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