@ Html.ActionLink MVC 4'ten denetleyiciye parametre geçirin


110

Bu satırda:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

BlogPostId'de aşağıdaki çalışma zamanı hatasını alıyorum:

Parametreler sözlüğü, 'System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, Nop.Web.Models.Blogs.BlogPostModel, Boolean)' yöntemi için null yapılamayan 'System.Int32' türündeki 'blogPostId' parametresi için boş bir giriş içerir 'Nop.Web.Controllers.BlogController'. İsteğe bağlı bir parametre bir başvuru türü, null atanabilir bir tür olmalı veya isteğe bağlı bir parametre olarak bildirilmelidir. Parametre adı: parametreler

Bunun üstüne zaten bir değer atadım, örneğin

    @{         
        var blogPostId = Model.Id;          
     }

Denetleyicim:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

Yanlış bir şey mi yapıyorum? Lütfen bana bir örnek ver.

Yanıtlar:


258

Html.ActionLinkYardımcının yanlış aşırı yüklemesini kullanıyorsunuz . routeValuesAslında düşündüğün şey htmlAttributes! Sadece oluşturulan HTML'ye bakın, bu çapanın href özelliğinin beklediğiniz gibi görünmediğini göreceksiniz.

İşte kullandığınız şey:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // routeValues
    new {                                                     // htmlAttributes
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    }
)

ve işte kullanmanız gerekenler:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // controllerName
    new {                                                     // routeValues
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    },
    null                                                      // htmlAttributes
)

Ayrıca kodunuzla ilgili çok ciddi başka bir sorun var. Aşağıdaki routeValue:

replyblogPostmodel = Model

Bunun gibi karmaşık nesneleri bir ActionLink'te iletemezsiniz. Öyleyse ondan kurtulun ve BlogPostModelparametreyi kontrolör eyleminizden kaldırın . blogPostIdModeli, bu modelin kalıcı olduğu yerden almak için veya GET eyleminde modeli aldığınız her yerden tercih ederseniz , parametreyi kullanmalısınız :

public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
    BlogPostModel model = repository.Get(blogPostId);
    ...
}

İlk probleminiz yanlış aşırı yükleme ile ilgiliyse, yardımcılarınızı adlandırılmış parametreleri kullanarak yazmanızı tavsiye ederim:

@Html.ActionLink(
    linkText: "Reply",
    actionName: "BlogReplyCommentAdd",
    controllerName: "Blog",
    routeValues: new {
        blogPostId = blogPostId, 
        captchaValid = Model.AddNewComment.DisplayCaptcha
    },
    htmlAttributes: null
)

Artık yalnızca kodunuzun daha okunaklı olması değil, Microsoft'un bu yardımcılar için yaptığı binlerce aşırı yükleme arasında asla kafa karışıklığı yaşamayacaksınız.


Yorumları değiştirmeniz gerekiyor controllerNameveactionName
2013

@DarinDimitrov: Modeli parametre olarak nasıl iletebilirim?
NetraSW

1
@ DarinDimitrov, @ webdeveloper: actionresult'ta [httppost] 'dan bahsetmem gerekiyor mu?
NetraSW

@NetraSW, [HttpPost]bağlantı bir GET isteği gönderdiği için eylemde olmamalısınız . [HttpPost]denetleyici eyleminize yalnızca POST isteği ile erişilebileceği anlamına gelir.
Darin Dimitrov

@DarinDimitrov: HOw bunu gerçekleştirebilir miyim? model, özellikleri boş olarak gönderir. Lütfen bana yol göster.
NetraSW

12

Aşağıdaki gibi iki parametre geçirmem gerekiyor:

/ Denetleyici / İşlem / Param1Value / Param2Value

Bu yoldan:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

bu url'yi oluşturacak

/ Controller / Action / Param1Value? Param2Name = Param2Value

İkinci parametreyi birinci parametrede birleştirerek geçici bir çözüm yöntemi kullandım ve istediğimi elde ettim:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

Ve anlıyorum:

/ Denetleyici / İşlem / Param1Value / Param2Value


Görünüşe göre, bu Param1Value null olduğunda olur. Az önce aynı problemle karşılaştım.
AFract

3

Aşağıdakileri kullanarak değerleri aktarabilirsiniz.

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

Denetleyici:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

Ve URL şöyle görünür:

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay

0

Sorun, null olan Model.Id değerinde olmalıdır. Bir değer atayarak onaylayabilirsiniz, örn.

@{         
     var blogPostId = 1;          
 }

Hata ortadan kalkarsa, model kimliğinizi görünüme geçirmeden önce bir değerin olduğundan emin olmanız gerekir.


1
Hayır, sorun bu değil.
Darin Dimitrov
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.