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

  • Emotional Trancer

    Emotional Tr

    4 Mart 2010
  • jagadambarecords

    jagadambarec

    13 AĞUSTOS 2008
  • LatinNinja99

    LatinNinja99

    28 EKİM 2011