ASP.NET MVC неоднозначные методы действия

Вы вызываете функции PowerShell без скобок и без использования запятой в качестве разделителя. Попробуйте использовать:

test "ABC" "DEF"

В PowerShell запятая (,) является оператором массива, например

$a = "one", "two", "three"

Устанавливает $a в массив с тремя значениями.

131
задан Jonathan Freeland 25 June 2009 в 20:19
поделиться

3 ответа

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), если это лучше соответствует вашим целям.

179
ответ дан 24 November 2019 в 00:18
поделиться

Параметры в ваших маршрутах {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+" }
                );
7
ответ дан 24 November 2019 в 00:18
поделиться
routes.MapRoute("AssignRemove",
                "Items/{parentName}/{itemName}",
                new { controller = "Items", action = "Assign" }
                );

рассмотрите возможность использования библиотеки тестовых маршрутов MVC Contribs для проверки ваших маршрутов

"Items/parentName/itemName".Route().ShouldMapTo<Items>(x => x.Assign("parentName", itemName));
0
ответ дан 24 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: