Вложенные Html.Action звонки в Razor - PullRequest
1 голос
/ 11 января 2012

РЕДАКТИРОВАТЬ: Очевидно, что это значительно упрощенная версия моего сайта, и если я создаю тестовое приложение, с этим шаблоном он работает нормально. В нашем реальном приложении мы используем T4MVC, и это все в пределах области. Я предполагаю, что один из этих факторов вызывает мою проблему ...

EDIT2: все маршруты по умолчанию определены, и если я перехожу непосредственно к / AreaName / ControllerName / SubChild? Val = 123, он рендерится.

У меня особенная проблема с Mvc, и я надеюсь, что кто-то может помочь ...

У меня есть контроллер со следующими методами действий

public ActionResult Index()
{
   return View(GetModel());
}

public ActionResult Result Child(string blah)
{
   return View(GetModel(blah));
}

public ActionResult Result SubChild(int val)
{
   return View(GetModel(val));
}

У меня тогда есть 3 вида бритвы.

Index.cshtml

<div>
@Html.Action("Child", new { blah = "raaa"})
</div>

Child.cshtml

    <div>
@*ERROR HERE*@
    @Html.Action("SubChild", new { val = 123})
    </div>

SubChild.cshtml

<h1>@Model.val</h1>

Когда я перехожу к / я получаю исключение, говорящее, что Msgstr "Ни один маршрут в таблице маршрутов не соответствует заданным значениям." на Html.Action, вызывающем действие SubChild.

Это все в одной области и в одном контроллере. Если я изменю разметку и использую Html.Partial для вызова дочернего представления (а также создаю модель и передаю ее в представлении), она отображается нормально. Проблема возникает, когда я вызываю Html.Action в представлении, которое уже отображается с использованием Html.Action.

Я попытался полностью квалифицировать действие, используя / area / controller / action, указав контроллер в вызове Html.Action, передав область в качестве параметра в значениях маршрута и их комбинациях.

У кого-нибудь есть идеи, что это может быть? Я предполагаю, что вы можете вызвать Html.Action в представлениях, которые визуализируются с использованием этого, я думаю, что я могу ошибаться ...

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Ну, из коробки MVC 3 имеет параметр маршрута по умолчанию с именем id. Ваше действие SubChild имеет параметр с именем val, так что это, вероятно, проблема.

Либо переименуйте параметр в действии в id, либо добавьте новый маршрут

routes.MapRoute(
    "SubChild", 
    "{controller}/SubChild/{val}", 
    new
    {
        controller = "ControllerName",
        action = "SubChild",
        val = UrlParameter.Optional
    }
);
2 голосов
/ 11 января 2012

Ваши параметры действительно называются blah и val?Потому что обычно первый параметр всегда называется id.Проверьте метод RegisterRoutes(RouteCollection routes) в вашем global.asax.cs.Должно быть что-то вроде

routes.MapRoute("Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults

, которое указывает, как должны называться ваши параметры.

Я думаю, что ваши действия должны быть такими:

public ActionResult Index()
{
    return View(GetModel());
}

public ActionResult Result Child(string id)
{
    return View(GetModel(id));
}

public ActionResult Result SubChild(int id)
{
    return View(GetModel(id));
}

Тогдакод в ваших представлениях должен быть: Index.cshtml

<div>
    @Html.Action("Child", new { id = "raaa"})
</div>

Child.cshtml

<div>
    @Html.Action("SubChild", new { id = 123})
</div>
1 голос
/ 12 января 2012

Похоже, что проблема связана с нашими областями и настройкой маршрутизации.

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

Спасибо за помощь, я проголосовал за другие ответы, так как думаю, что они могут помочь кому-то еще в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...