충돌하는 두 가지 조치 방법이 있습니다. 기본적으로 항목 ID 또는 항목 이름과 상위 항목에 따라 두 가지 경로를 사용하여 동일한 뷰를 얻을 수 있기를 원합니다 (항목은 다른 상위에서 동일한 이름을 가질 수 있음). 검색어를 사용하여 목록을 필터링 할 수 있습니다.
예를 들어 ...
Items/{action}/ParentName/ItemName
Items/{action}/1234-4321-1234-4321
여기 내 행동 방법이 있습니다 ( Remove
활동 방법 도 있습니다) ...
// Method #1
public ActionResult Assign(string parentName, string itemName) {
// Logic to retrieve item's ID here...
string itemId = ...;
return RedirectToAction("Assign", "Items", new { itemId });
}
// Method #2
public ActionResult Assign(string itemId, string searchTerm, int? page) { ... }
그리고 여기 경로가 있습니다 ...
routes.MapRoute("AssignRemove",
"Items/{action}/{itemId}",
new { controller = "Items" }
);
routes.MapRoute("AssignRemovePretty",
"Items/{action}/{parentName}/{itemName}",
new { controller = "Items" }
);
page
매개 변수가 null 일 수 있기 때문에 오류가 발생하는 이유를 이해하지만 오류 를 해결하는 가장 좋은 방법을 알 수 없습니다. 내 디자인은 처음부터 좋지 않습니까? Method #1
검색 매개 변수를 포함하도록 서명을 확장 하고 논리를 Method #2
둘 다 호출하는 개인 메소드로 옮기는 방법에 대해 생각했지만 실제로 모호성을 해결할 것이라고는 생각하지 않습니다.
도움을 주시면 감사하겠습니다.
실제 솔루션 (Levi의 답변을 기반으로 함)
다음 클래스를 추가했습니다 ...
public class RequireRouteValuesAttribute : ActionMethodSelectorAttribute {
public RequireRouteValuesAttribute(string[] valueNames) {
ValueNames = valueNames;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) {
bool contains = false;
foreach (var value in ValueNames) {
contains = controllerContext.RequestContext.RouteData.Values.ContainsKey(value);
if (!contains) break;
}
return contains;
}
public string[] ValueNames { get; private set; }
}
그런 다음 액션 방법을 장식했습니다 ...
[RequireRouteValues(new[] { "parentName", "itemName" })]
public ActionResult Assign(string parentName, string itemName) { ... }
[RequireRouteValues(new[] { "itemId" })]
public ActionResult Assign(string itemId) { ... }
return ValueNames.All(v => controllerContext.RequestContext.RouteData.Values.ContainsKey(v));
contains = ...
다음과 같이 섹션을 교체 하십시오.contains = controllerContext.RequestContext.RouteData.Values.ContainsKey(value) || controllerContext.RequestContext.HttpContext.Request.Params.AllKeys.Contains(value);
ActionResult DoSomething(Person p)
. 여기서 Person
와 같이 다양한 간단한 속성 Name
이 있으며 속성 이름으로 직접 요청합니다 (예 :) /dosomething/?name=joe+someone&other=properties
.
controllerContext.HttpContext.Request[value] != null
하는 경우 대신 controllerContext.RequestContext.RouteData.Values.ContainsKey(value)
;을 사용해야 합니다 . 그럼에도 불구하고 좋은 작품입니다.