Вы вызываете функции PowerShell без скобок и без использования запятой в качестве разделителя. Попробуйте использовать:
test "ABC" "DEF"
В PowerShell запятая (,) является оператором массива, например
$a = "one", "two", "three"
Устанавливает $a
в массив с тремя значениями.
MVC не поддерживает перегрузку метода на основе только сигнатуры, поэтому это не удастся:
public ActionResult MyMethod(int someInt) { /* ... */ }
public ActionResult MyMethod(string someString) { /* ... */ }
Однако он поддерживает перегрузку метода на основе атрибута:
[RequireRequestValue("someInt")]
public ActionResult MyMethod(int someInt) { /* ... */ }
[RequireRequestValue("someString")]
public ActionResult MyMethod(string someString) { /* ... */ }
public class RequireRequestValueAttribute : ActionMethodSelectorAttribute {
public RequireRequestValueAttribute(string valueName) {
ValueName = valueName;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) {
return (controllerContext.HttpContext.Request[ValueName] != null);
}
public string ValueName { get; private set; }
}
В приведенном выше примере атрибут просто говорит: «Этот метод соответствует, если в запросе присутствует ключ xxx ». Вы также можете фильтровать информацию, содержащуюся в маршруте (controllerContext.RequestContext), если это лучше соответствует вашим целям.
Параметры в ваших маршрутах {roleId}
, {applicationName}
и {roleName}
не соответствуют именам параметров в ваших методах действий. Не знаю, имеет ли это значение, но из-за этого сложнее понять, в чем заключаются ваши намерения.
Соответствует ли ваш itemId шаблону, который можно сопоставить с помощью регулярного выражения? Если это так, то вы можете добавить ограничение к своему маршруту, чтобы только URL-адреса, соответствующие шаблону, идентифицировались как содержащие itemId.
Если ваш itemId содержит только цифры, то это будет работать:
routes.MapRoute("AssignRemove",
"Items/{action}/{itemId}",
new { controller = "Items" },
new { itemId = "\d+" }
);
Изменить: вы также можете добавить ограничение к маршруту AssignRemovePretty
, чтобы оба {parentName}
и {itemName}
обязательны.
Изменить 2: Кроме того, поскольку ваше первое действие просто перенаправляет на ваше второе действие, вы можете устранить некоторую двусмысленность, переименовав первое.
// Method #1
public ActionResult AssignRemovePretty(string parentName, string itemName) {
// Logic to retrieve item's ID here...
string itemId = ...;
return RedirectToAction("Assign", itemId);
}
// Method #2
public ActionResult Assign(string itemId, string searchTerm, int? page) { ... }
Затем укажите имена действий в ваших маршрутах, чтобы вызвать правильный метод:
routes.MapRoute("AssignRemove",
"Items/Assign/{itemId}",
new { controller = "Items", action = "Assign" },
new { itemId = "\d+" }
);
routes.MapRoute("AssignRemovePretty",
"Items/Assign/{parentName}/{itemName}",
new { controller = "Items", action = "AssignRemovePretty" },
new { parentName = "\w+", itemName = "\w+" }
);
routes.MapRoute("AssignRemove",
"Items/{parentName}/{itemName}",
new { controller = "Items", action = "Assign" }
);
рассмотрите возможность использования библиотеки тестовых маршрутов MVC Contribs для проверки ваших маршрутов
"Items/parentName/itemName".Route().ShouldMapTo<Items>(x => x.Assign("parentName", itemName));