2013-11-07 4 views
-1

Я создал систему в MVC, используя учебник NerdDinner в качестве базы для работы.Общие сведения о маршрутах ASP.NET MVC reg

Все работало отлично, пока я не использовал методы одинарного действия, такие как

Вот это Global.asax.cs

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "mysample", id=UrlParameter.Optional } 
); 

который направляет к

http:localhost/Home/mysample 

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

http:localhost/<controller>/<action>/<params> 
ex: localhost/mycontroller/myaction/details/myname 

Любая помощь очень ценится.

Спасибо.

обновление 1:

я прописан маршрутизатор так, как

routes.MapRoute(
       "myname",            // Route name 
       "{controller}/{action}/{details}/{myname}",       // URL with parameters 
       new { controller = "mycontroller", action = "myaction", details= "details", myname= "" } // Parameter defaults 
      ); 

и повторен значение с помощью следующего синтаксиса в

String name=RouteData.Values["myname"].ToString(); 

он работает отлично.

, но даже если URL называется

localhost/mycontroller/myaction/details 

его перенаправляется к этому контроллеру и ошибки бросаются в пустую ссылку ...

как избежать этого?

+0

Вы хотите несколько параметров в вашем маршруте или цепочку действий? – freshbm

+0

@freshbm action chaining – GowthamanSS

+0

Вы не можете этого сделать. У вас может быть несколько параметров для одного маршрута, но вы не можете иметь несколько действий, прикованных по маршрутам MVC. Это пример цепочки действий, но это не тривиально. http://jwbs-blog.blogspot.com/2009/08/chaining-aspnet-mvc-actions.html Что вы хотите сделать? – freshbm

ответ

1

Вы не можете определить несколько действий в одном маршруте MVC. В конфигурации маршрутизации MVC используются для отображения ваших Controlers и действий для пользователей дружественных маршрутов и:

  1. Keep адрес чистых
  2. Держите URL, обнаруживаемого конечных пользователями
  3. идентификаторов баз данных Избегайте в URL

Понимание маршрута по умолчанию конфигурации:

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

Свойство «routeTemplate» на классе маршрута определяет правило соответствия Url , который должен использоваться для оценки, если правило маршрута относится к конкретному входящему запросу.

Свойство «defaults» в классе Route определяет словарь значений по умолчанию для использования в случае, если входящий URL-адрес не содержит , включая одно из указанных значений параметров.

По умолчанию маршрута будет отображать все запросы, так как она определила значения по умолчанию для каждого свойства в routeTemplate, {} означает, что свойство является переменным, если не обеспечить значение для этого паров в URL, он будет пытаться принять значение по умолчанию если вы его предоставите. В маршруте по умолчанию он определил значения по умолчанию для контроллера, действие и параметр id являются необязательными. Это означает, что если у вас есть маршрут, как это:

.../Account/Вход

Это приведет вас к счету контроллера, Войти действия и потому, что вы не указали пропеллер и он определяется как необязательный, он будет работать.

.../Главная

Это также будет работать, и это приведет вас к Главной и -регулятору MYSAMPLE действия

При определении пользовательского маршрута, как вы делали :

routes.MapRoute(
       "myname",            // Route name 
       "{controller}/{action}/{details}/{myname}",       // URL with parameters 
       new { controller = "mycontroller", action = "myaction", details= "details", myname= "" } // Parameter defaults 
      ); 

Вы не указали мое имя как необязательное, и вы не указал его на ваш маршрут, это означает, что ваш URL: localhost/mycontroller/myaction/details wan't будет обрабатываться вашим пользовательским маршрутом myname. Он будет обрабатываться по умолчанию. И когда вы пытаетесь получить доступ к своему параметру myname в контроллере, он не будет там, и вы получите нулевую ошибку ссылки. Если вы хотите указать значение по умолчанию вашего параметра, если оно отсутствует в URL-адресе, вам нужно сделать это в своем контроллере. Например:

public class MyController : Controller 
    { 
     public ActionResult MyAction(string details = "details", string myname = "") 
     { 
       ... 

и изменить свой собственный путь к:

routes.MapRoute(
        "myname",            // Route name 
        "{controller}/{action}/{details}/{myname}",       // URL with parameters 
        new { controller = "mycontroller", action = "myaction", details= UrlParameter.Optional, myname= UrlParameter.Optional } // Parameter defaults 
       ); 

Но вы можете определить только один контроллер и только одно действие, остальные routeTemplate являются параметрами.

Вы не можете определить два действия в одном маршруте. Это не имеет смысла.

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