Я знаю, что здесь есть много 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.
Что-то я здесь не хватает? Любое понимание, инструкция, руководство, которое вы можете предоставить, будут очень признательны.
Нет, маршрутизация не работает таким образом. Вы можете достичь того, чего хотите, но это немного более активно и требует использования ограничений маршрутизации и других факторов. У меня нет времени, чтобы объяснить это, но, надеюсь, другие будут. MVC допускает только один метод действия для HTTP-глагола (get, post и т. Д.) Для любого метода. Таким образом, вы можете иметь Index() и Index (строка x), но они должны быть разными глаголами. Это ограничение механизма привязки модели. MVC не знает, какую перегрузку выбрать, потому что нет типов, связанных с полями или ответами HTTP-формы. –
Ну, я думаю, это и устраивает. Спасибо Эрик - я ценю ваше понимание. Я рассмотрю ограничения маршрутизации, чтобы увидеть, могу ли я обойти это. –
Хорошо, хорошо, я смог получить некоторые аспекты этого, чтобы работать, что, безусловно, поможет. Оказывается, что у меня есть ActionResult с параметром, например: DoSomething (String id), и у меня нет метода DoSomething() ActionResult - я могу использовать этот метод с условным или без параметра. Я тестировал его только со строками, но он работает. Этого, безусловно, будет достаточно для использования того же действия и представления новых форм для вставок и предварительно заполненных форм для обновлений. –