Yönlendirme: Mevcut işlem talebi […] aşağıdaki işlem yöntemleri arasında belirsizdir


100

Browse.chtmlKullanıcının bir arama terimi girebileceği veya arama terimini boş bırakabileceği bir View adlı bir Görünüm var . Arama terimini girerken sayfayı yönlendirmek istiyorum http://localhost:62019/Gallery/Browse/{Searchterm} ve hiçbir şey girilmediğinde tarayıcıyı yönlendirmek istiyorum http://localhost:62019/Gallery/Browse/Start/Here.

Bunu denediğimde şu hatayı alıyorum:

'GalleryController' denetleyici türünde 'Gözat' eylemi için geçerli istek, aşağıdaki eylem yöntemleri arasında belirsizdir: AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult türünde System.Web.Mvc.ActionResult Browse (System.String) (Int32, System.String) AutoApp_MVC.Controllers.GalleryController türünde

MVC ile yaptığım her şey ilk defa. Bu noktada başka ne deneyebilirim bilmiyorum.

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

Global.asax.cs içinde de bu var:

    routes.MapRoute(
         "StartBrowse",
         "Gallery/Browse/{s1}/{s2}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             s1 = UrlParameter.Optional,
             s2 = UrlParameter.Optional
         });



    routes.MapRoute(
         "ActualBrowse",
         "Gallery/Browse/{searchterm}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             searchterm=UrlParameter.Optional
         });

Yanıtlar:


161

Bir denetleyicide aynı ada sahip en fazla 2 eylem yöntemine sahip olabilirsiniz ve bunu yapmak için 1 olmalıdır [HttpPost], diğeri olmalıdır [HttpGet].

Her iki yönteminiz de GET olduğundan, eylem yöntemlerinden birini yeniden adlandırmalı veya farklı bir denetleyiciye taşımalısınız.

2 Gözat yönteminiz geçerli C # aşırı yüklemeleri olsa da, MVC eylem yöntemi seçicisi hangi yöntemin çağrılacağını anlayamıyor. Yöntemi (veya tersini) yöntemle eşleştirmeye çalışacaktır ve bu algoritma güçlü bir şekilde yazılmamıştır.

Farklı eylem yöntemlerine işaret eden özel rotalar kullanarak istediğinizi başarabilirsiniz:

... Global.asax içinde

routes.MapRoute( // this route must be declared first, before the one below it
     "StartBrowse",
     "Gallery/Browse/Start/Here",
     new
     {
         controller = "Gallery",
         action = "StartBrowse",
     });

routes.MapRoute(
     "ActualBrowse",
     "Gallery/Browse/{searchterm}",
     new
     {
         controller = "Gallery",
         action = "Browse",
         searchterm = UrlParameter.Optional
     });

... ve kontrolörde ...

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult StartBrowse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

Ayrıca , ayırt etmek için bir özniteliği uygulayarak denetleyicide aynı adı verilen eylem yöntemlerini tutabilirsiniz[ActionName] . Yukarıdaki ile aynı Global.asax'ı kullanarak, denetleyiciniz şu şekilde görünür:

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

[ActionName("StartBrowse")]
public ActionResult Browse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

Öyleyse, yukarıdaki örneğinizde yeni bir görünüm oluşturmam gerekecek? ActionName etiketini kullanmanın bir faydası yok gibi görünüyor, çünkü bunun yalnızca tüm eylem yöntemlerini yeniden adlandırmak için çalıştığını düşünüyorum (her ikisini aynı anda tutamaz). MVC'nin nasıl çalıştığını bilmek güzel. Teşekkürler.
Dave

6
Hayır, herhangi bir yeni görünüm oluşturmanıza gerek yoktur. Her iki işlem için de aynı görünümü yeniden kullanabilirsiniz. Görünüm adını ilk argüman olarak return View("Browse", summaries);
iletin

Aşırı yükleme, gelecekteki bazı sürümlere dahil edilecek mi? Rotaları değiştirmek ek bir iştir ve değişiklikler yapıldığında ek bakım gerekir.
Old Geezer

@ OldGeezer muhtemelen hayır, çünkü bir geçici çözüm (yukarıda) var ve bir denetleyicideki aşırı yüklenmiş eylem yöntemleri genellikle iyi bir fikir değil.
danludwig

4

Sorunun ne zaman sorulduğunu bilmiyorum, bu çözüm mevcuttu, ancak şunları kullanabilirsiniz:

Request.QueryString["key"]

Yani bu, sorununuz için iyi çalışmalıdır:

[HttpGet]
public ActionResult Browse()
{
    if( Request.QueryString["id"] != null )        
        var summaries = /* search using id as search term */
    else /*assuming you don't have any more option*/
        var summaries = /* default list when nothing entered */

    return View(summaries);
} 

2

Varsayılan rotadan önce RouteConfig.cs'ye aşağıdaki kodu ekleyin

routes.MapMvcAttributeRoutes();

Ve denetleyiciye aşağıdaki gibi yol nitelikleri ekleyin:

    [Route("Cars/deteals/{id:int}")]
    public ContentResult deteals(int id)
    {
        return Content("<b>Cars ID Is " + id + "</b>");
    }

    [Route("Cars/deteals/{name}")]
    public  ContentResult deteals(string name)
    {
        return Content("<b>Car name Is " + name + "</b>");

    }

1

Sanırım burada dikkat edilmesi gereken nokta, istek sınıfını kullanarak sorgu dizesi parametrelerini örtük olarak test etmenize gerek olmamasıdır.

MVC sizin için eşlemeyi yapar (MVC rotalarınızda ciddi değişiklikler yapmadıysanız).

Böylece bir eylem bağlantı yolu

/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/

(yüzey) kontrolörünüz tarafından tanımlanan parametre ile otomatik olarak kullanılabilir olacaktır:

public ActionResult Logout(string DestinationUrl)

MVC işi yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.