ASP.Net Mvc 3 Url.Action метод использует значения параметров из предыдущего запроса - PullRequest
11 голосов
/ 14 июля 2011

Когда URL-адреса генерируются автоматически с помощью помощника Url.Action, если страница содержит строку, аналогичную

@Url.Action ( "Edit", "Студент")

Ожидается, что

сгенерирует URL-адрес, подобный domain/student/edit, и будет работать так, как ожидается. Но если запрошенный URL-адрес содержит некоторые параметры, такие как domain/student/edit/210, приведенный выше код использует эти параметры из предыдущего запроса и создает нечто похожее, даже если я не предоставил такой параметр для метода Action.

Короче говоря, если запрошенный URL-адрес содержит какие-либо параметры, любые автоматически сгенерированные ссылки на странице (обслуживаемые для этого запроса) также будут включать эти параметры, независимо от того, указываю я их или нет в методе Url.Action.

Что не так?

Ответы [ 4 ]

19 голосов
/ 25 октября 2012

Используйте ответ Дарина на этот похожий вопрос .

@Url.Action("Edit","Student", new { ID = "" })
8 голосов
/ 14 июля 2011

Странно, не могу воспроизвести проблему:

public class HomeController : Controller
{
    public ActionResult Index(string id)
    {
        return View();
    }

    public ActionResult About(string id)
    {
        return View();
    }
}

и внутри Index.cshtml:

@Url.Action("About", "Home")

Теперь, когда я запрашиваю /home/index/123, генерируется хелпер /home/about как и ожидалось.Нет призрачных параметров.Итак, чем отличается ваш сценарий?


ОБНОВЛЕНИЕ:

Теперь, когда вы прояснили свой сценарий, кажется, что у вас есть следующее:

public class HomeController : Controller
{
    public ActionResult Index(string id)
    {
        return View();
    }
}

и внутриIndex.cshtml вы пытаетесь использовать:

@Url.Action("Index", "Home")

Если вы запрашиваете /home/index/123, это генерирует /home/index/123 вместо ожидаемого /home/index (или просто / с учетом значений по умолчанию).

Такое поведение разработано.Если вы хотите изменить его, вам придется написать свой собственный помощник, который игнорирует данные текущего маршрута.Вот как это может выглядеть:

@UrlHelper.GenerateUrl(
    "Default", 
    "index", 
    "home", 
    null, 
    Url.RouteCollection, 
    // That's the important part and it is where we kill the current RouteData
    new RequestContext(Html.ViewContext.HttpContext, new RouteData()), 
    false
)

Это сгенерирует правильный URL, который вы ожидали.Конечно это некрасиво.Я бы порекомендовал вам заключить его в многоразовый помощник.

0 голосов
/ 28 сентября 2015

Вы можете зарегистрировать собственный маршрут для этого действия, например:

routes.MapRoute("Domain_EditStudentDefault",
            "student/edit",
            new { 
                controller = MVC.Student.Name, 
                action = MVC.Student.ActionNames.Edit,
                ID = UrlParameter.Optional
            },
            new object(),
            new[] { "MySolution.Web.Controllers" }
        );

тогда вы можете использовать url.RouteUrl("Domain_EditStudentDefault") url RouteUrl вспомогательное переопределение только с параметром routeName, который генерирует URL без параметров.

0 голосов
/ 14 июля 2011

Использовать перегрузку ActionLink, которая использует параметры и поставляет ноль

...