ASP.NET MVC — переход к другому представлению без изменения URL-адреса

можно ли перейти к другому представлению без изменения URL-адреса? Например, в представлении «Индекс» у меня есть ссылка для перехода в представление «Подробности», но я хотел бы сохранить URL-адрес прежним.

Большое спасибо, Кенни.


person Xuan Vu    schedule 07.10.2009    source источник
comment
Взгляните на этот вопрос: stackoverflow.com /вопросы/752922/   -  person Matthew Jones    schedule 07.10.2009
comment
Я думаю, что то, что он хочет выполнить (перейти к другому представлению на основе запроса), немного отличается от того, что я хочу выполнить. Спасибо.   -  person Xuan Vu    schedule 07.10.2009
comment
На самом деле оказалось, что это очень полезно! stackoverflow .com/questions/799511/   -  person Valamas    schedule 24.09.2013


Ответы (5)


Как уже упоминалось, вы можете сделать ссылку Details Ajax.ActionLink и использовать ее для изменения содержимого div.

В противном случае, единственный другой способ, который я могу придумать, - сделать так, чтобы ваши данные связывали кнопку и POST с вашим индексным действием. Вы можете применить CSS к кнопке, чтобы она больше походила на обычную html-ссылку.

public class HomeController : Controller {

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

   [AcceptVerbs(HttpVerbs.Post)]
   public ActionResult Index(int hiddenInputFieldId) {
      return View("Details");
   } 
}

ИЗМЕНИТЬ:

Судя по комментарию JonoW, вам придется передать «фальшивый» параметр с вашим сообщением, хотя это не проблема, вы можете просто использовать для него скрытое поле ввода.

person Kirschstein    schedule 07.10.2009
comment
Спасибо, я посмотрю на Ajax.ActionLink. При этом мне нужно скрыть содержимое индекса перед отображением деталей, верно? - person Xuan Vu; 07.10.2009
comment
Вы указываете целевой div для изменения содержимого, поэтому, если весь ваш контент, относящийся к действию Index, находится в div под названием «main», он будет мгновенно заменен действием Details. - person Kirschstein; 07.10.2009
comment
Это не скомпилируется, ваши 2 сигнатуры метода Index() идентичны, их нужно как-то различать. - person JonoW; 08.10.2009

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

public class HomeController : Controller {
    public ActionResult Index() {
        return View("home");
    }

    public ActionResult About() {
        return View("home");
    }
}

Если вы хотите, чтобы ссылка загружала контент с другой страницы без изменения URL-адреса, вам придется использовать Ajax для вызова сервера для контента и обновления частей страницы, которые вам нужно изменить, с новым контентом.

person John Sheehan    schedule 07.10.2009

Я не знаю, почему вы хотели бы это сделать, но у вас может быть Ajax.Actionlink, который отображает подробное представление.

Почти нет причин скрывать URL-адрес, не уверен, что вы хотели бы ... может быть, вы объясните, что кто-то может предложить лучший подход.

person griti    schedule 07.10.2009
comment
У меня есть сайт, на который клиенты могут зайти со своим уникальным идентификатором, например, mysite.com/ABC123, который затем отобразит страницу индекса в этом URL-адресе. В содержимом этой страницы индекса есть ссылка на страницу сведений, где они могут отправить простую форму. Я в основном хотел бы сохранить URL-адрес таким же, вот и все. - person Xuan Vu; 07.10.2009

Для этого можно использовать старый добрый Server.Transfer. Тем не менее, я бы предложил сделать это так, как это подробно описано ТАК пост. Это дает вам простой способ вернуть ActionMethod из вашего текущего действия, не приправляя ваш код Server.Transfer() повсюду.

person womp    schedule 07.10.2009
comment
Спасибо, посмотрю этот пост. - person Xuan Vu; 07.10.2009

Вы можете сделать это, визуализируя частичные изображения. Я делаю это, чтобы загружать различные экраны поиска. Пример кода выглядит следующим образом (это немного отличается от моего фактического кода, но вы поняли идею):

<% Html.RenderPartial(Model.NameOfPartialViewHere, Model.SomeVM); %>

Лично я не понимаю, почему вы просто не меняете URL?

person RichardOD    schedule 07.10.2009
comment
Это просто требование клиента, лично я тоже не думаю, что это хорошая идея. - person Xuan Vu; 07.10.2009