2015-02-06 2 views
1

Я знаю, что здесь есть много Q & A, касающихся маршрутизации MVC. К сожалению, у меня все еще есть некоторые проблемы, касающиеся маршрутизации, которые я не понимаю.Понимание ASP.NET MVC 5 Маршрутизация

В первую очередь - Могу ли я иметь onloadload ActionResults в моем контроллере?

Например, я делаю 3 запроса к одному контроллеру/действию с разными параметрами.

  • "/ MyController/DoSomething"
  • "/ MyController/DoSomething/[Guid String]
  • "/MyController/DoSomething/[Guid String]/TypeA

... и в контроллере у меня есть эти методы

public ActionResult DoSomething() 
{ 
    ViewBag.Title = "Do Something By Default"; 
    return View(); 
} 

public ActionResult DoSomething(String id) 
{ 
    ViewBag.Title = "Do Something By id"; 
    return View(); 
} 

public ActionResult DoSomething(String id, String type) 
{ 
    ViewBag.Title = "Do Something By id and type"; 
    return View(); 
} 

я ожидал бы каждый перегруженный метод, чтобы сделать это вещь - но это не так. Единственный вызов ActionMethod - DoSomething() независимо от параметров, которые я вводил. Короче говоря, DoSomething (String id) и DoSomething (String id, String type) полностью игнорируются.

Даже когда я попытался это ...

public ActionResult DoSomething(String? id) 
{ 
    ViewBag.Title = "Do Something Conditionally"; 
    return View(); 
} 

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

Ошибка 4 Типа «строка» должна быть не-обнуляемый типа значения для того, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «System.Nullable»

ПРИМЕЧАНИЕ. Мои параметры являются строками (технически GUID) - не целыми числами.

я понял, возможно, мне нужно, чтобы отобразить эти маршруты в классе/App_Start/RouteConfig и попытался это просто, чтобы увидеть, если я мог бы получить один перегруженный метод работы

routes.MapRoute(
    "MyController", 
    "MyController/DoSomething/{id}", 
    new { controller = "MyController", action = "DoSomething", id = "" } 
); 

... и до сих пор DoSomething (String id) ActionResult не был вызван. Ошибок нет, никаких исключений. Это было, если бы у меня даже не было указанного MapRoute.

Что-то я здесь не хватает? Любое понимание, инструкция, руководство, которое вы можете предоставить, будут очень признательны.

+1

Нет, маршрутизация не работает таким образом. Вы можете достичь того, чего хотите, но это немного более активно и требует использования ограничений маршрутизации и других факторов. У меня нет времени, чтобы объяснить это, но, надеюсь, другие будут. MVC допускает только один метод действия для HTTP-глагола (get, post и т. Д.) Для любого метода. Таким образом, вы можете иметь Index() и Index (строка x), но они должны быть разными глаголами. Это ограничение механизма привязки модели. MVC не знает, какую перегрузку выбрать, потому что нет типов, связанных с полями или ответами HTTP-формы. –

+0

Ну, я думаю, это и устраивает. Спасибо Эрик - я ценю ваше понимание. Я рассмотрю ограничения маршрутизации, чтобы увидеть, могу ли я обойти это. –

+0

Хорошо, хорошо, я смог получить некоторые аспекты этого, чтобы работать, что, безусловно, поможет. Оказывается, что у меня есть ActionResult с параметром, например: DoSomething (String id), и у меня нет метода DoSomething() ActionResult - я могу использовать этот метод с условным или без параметра. Я тестировал его только со строками, но он работает. Этого, безусловно, будет достаточно для использования того же действия и представления новых форм для вставок и предварительно заполненных форм для обновлений. –

ответ

0

Чтобы эффективно выполнить это - все, что требуется, это определить, с какими параметрами вы работаете, и применять значения по умолчанию в случае, если параметры равны нулю. В конечном итоге это приведет к одному действию. В случае приведенного выше примера - Удаление DoSomething() и DoSomething (String ID) и работает только в пределах границ в DoSomething (String ID, типа String)

Пример

public ActionResult DoSomething(String id, String type) 
{ 
    var _id = String.Empty 
    var _type = String.Empty 

    if(id != null) 
    { 
     _id = id 
    } 

    if(type != null) 
    { 
     _type = type 
    } 

    ViewBag.Title = "Do Something By id and type conditionally"; 
    return View(); 
} 

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

  • "/ MyController/DoSomething"
  • "/ MyController/DoSomething/[Guid String]
  • "/MyController/DoSomething/[Guid String]/TypeA
+0

Да, это прекрасный способ справиться с этим. type будет null, если параметр не указан (предполагается, что вы добавили параметр в свой маршрут). Хотя вы не можете иметь тип, если у вас нет идентификатора. Поэтому не уверен, что это требование. –

-1
  • Маршрутизация механизм в MVC, который определяет, какой метод действия для класса контроллера должен выполняться. Без маршрутизации метод действия не может быть сопоставлен. к запросу. - Маршрутизация является частью архитектуры MVC, поэтому ASP. MVC поддерживает маршрутизацию по умолчанию
  • Маршрутизация проверяет входящий URL-адрес и выясняет, какой контроллер и действие сопоставляются с запросом. Он создает исходящие URL-адреса, соответствующие действиям контроллера.
  • Он используется для создания удобного для пользователя URL-адреса.
  • Его также можно использовать для настройки начальной страницы приложения, так же как веб-формы asp.net.
+0

Это очень хороший ответ на вопрос * название *. -1. –

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