SORU
25 HAZİRAN 2009, PERŞEMBE


Belirsiz eylem yöntemleri ASP.NET MVC

Çakışan iki eylem yöntemleri var. Temelde, istiyorum edebilmek için, aynı görünüm kullanarak iki farklı rota, ya da bir öğenin KİMLİĞİ veya öğenin adını ve onun ebeveyni (öğeler var aynı ada üzerinde farklı anne-baba). Bir arama terimi listesini filtrelemek için kullanılabilir.

Örnek...

Items/{action}/ParentName/ItemName
Items/{action}/1234-4321-1234-4321

Burada eylem benim yöntemi (Remove var eylem yöntemleri)...

// 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) { ... }

Ve burada yollar

routes.MapRoute("AssignRemove",
                "Items/{action}/{itemId}",
                new { controller = "Items" }
                );

routes.MapRoute("AssignRemovePretty",
                "Items/{action}/{parentName}/{itemName}",
                new { controller = "Items" }
                );

Hata page parametre boş olabilir, ama bunu çözmek için en iyi yol olduğunu çözemedim bu yana meydana gelen, neden anlıyorum. Benim tasarım ile başlamak için kötüdür? Düşündüm uzanan Method #1'nin imzası vardır, arama parametreleri ve hareket mantığı Method #2 için özel bir yöntem ikisi de diyebilirsin ama ben inanmıyorum bunu gerçekten çözmek belirsizlik.

Herhangi bir yardım büyük mutluluk duyacağız.

< / ^ hr .

Gerçek Çözüm(Levi's yanıta göre)

Aşağıdaki sınıf ekledim...

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; }
}

Ve sonra eylem yöntemleri... dekore edilmiş

[RequireRouteValues(new[] { "parentName", "itemName" })]
public ActionResult Assign(string parentName, string itemName) { ... }

[RequireRouteValues(new[] { "itemId" })]
public ActionResult Assign(string itemId) { ... }

CEVAP
25 HAZİRAN 2009, PERŞEMBE


MVC bu başarısız olacak şekilde yöntemi aşırı imza dayalı destek vermez:

public ActionResult MyMethod(int someInt) { /* ... */ }
public ActionResult MyMethod(string someString) { /* ... */ }

Ancak, buyokdestek yöntemi öznitelik dayalı aşırı yükleme:

[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; }
}

Yukarıdaki örnekte, bu nitelik sadece "bu yöntem anahtarı . eğer maçlar diyor ^em>xxxistek mevcut." Ayrıca bilgi yolu (controllerContext.içinde bulunan tarafından filtreleyebilirsiniz RequestContext) eğer daha iyi amaçlarınıza uygun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Defence Videos

    Defence Vide

    13 Mayıs 2013
  • The Verge

    The Verge

    8 AĞUSTOS 2006
  • UsherVEVO

    UsherVEVO

    15 EKİM 2009