Параметры действия ASP.NET MVC с префиксом Binded несовместимы с Url.Route в Global.asax - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть страница сведений, содержащая поле формы с именем UserId.На той же странице у меня есть другая форма поиска с полем также с именем UserId.

Я использую Html.LabelFor (vm> vm.UserId) и Html.TextBoxFor (sm> sm.UserId) на двух разных моделях представления, vm - модель представления, а sm - модель поиска.(Да, свойство UserId в двух моделях имеет идентичные имена - поскольку они являются одним и тем же свойством домена.

Когда я перехожу на страницу, заполненный UserId на виртуальной машине вставляется в ОБА поля формы с именем UserId byMVC. Даже sm.UserId пусты.

Это моя первоначальная проблема. Есть несколько способов избежать этого. Моим решением было использовать флаг Prefix для sm.

[HttpGet]
    public ActionResult Search([Bind(Prefix = "Search")] SearchFormViewModel searchFormViewModel, PagingViewModel pagingViewModel)
    {

Это побудит MVC отобразить Search.UserId для имени поля в форме поиска, но свойство в коде все равно будет называться UserId.

Это решение, кажется, прекрасно работает!

НО: теперь мне нужно обратиться к search.UserId по маршруту из Global.asax. Я отображаю маршрут следующим образом:

 routes.MapRoute(
            "MyRouteName",
            "ControllerName/User/{Search.UserId}",
            new { controller = "ControllerName", action = "Search" }
            );

Моя проблема в том, что MVC не может сопоставить Search.UserId (потому чтоиз.), чтобы соответствовать UserId (с префиксом Search) в действии, показанном выше.

Так что, похоже, MVC имеет функцию префикса, которая на самом деле полностью поддерживается nok через Route-handler.

Ofcourse, я мог бы переименовать Search.UserId в Search_UserId, но затем имя, не совпадающее с именем, которое MVC ожидает в действии получения выше.(ожидает Search.UserId) Переименование Свойство UserId модели поиска решит проблему, но, поскольку оно имеет то же значение в домене, это выглядит как обходной путь.

Я что-то здесь упустил из-за использованияфункции префикса или это просто невозможно?

1 Ответ

0 голосов
/ 17 ноября 2010

Итак ... Я уже давно об этом думаю. - И мой коллега неожиданно показал мне свет.

Проблема заключается в том, что MVC отображает объект в словарь маршрутов.

<a href="<%: Url.RouteUrl("MyRouteName", new { Search.UserId = Model.UserId } ) %>" target="_blank">See the user</a>

стоимость работы. Потому что MVC не может обрабатывать. (Точку) в имени объекта.

  • но так как имя объекта является просто строковым ключом в routevaluedictionary, отображение его само по себе добилось цели:

    <a href="<%: Url.RouteUrl("MyRouteName", new RouteValueDictionary(new Dictionary<string, object>(){ "Search.UserId", Model.UserId })) %>" target="_blank">See the user</a>

...