Как записать клик и передать пользователя по ссылке с MVC3, C # и Razor? - PullRequest
0 голосов
/ 15 июня 2011

Когда пользователь нажимает на ссылку на моей странице, я хочу иметь возможность записать щелчок по этой ссылке, а затем отправить пользователя по этой ссылке в другом окне.

Учитывая следующее ActionLink:

@Html.ActionLink(Model.dsResults.Tables[0].Rows[i]["title"].ToString(), "LinkClick", new { itemListID = @Model.dsResults.Tables[0].Rows[i]["ItemListID"] })

LinkClick ActionResult будет вызываться с пропущенным ItemListID. Тем не менее, я не хочу возвращаться через мою модель / DB, чтобы получить ссылку. Могу ли я передать тип DataRow и получить ячейку, содержащую ссылку и другие сведения, и, во-вторых, после сохранения щелчка по ссылке, как перенаправить пользователя в новом окне на эту ссылку?

Есть ли в Razor HTML-помощники для такого рода вещей?

Спасибо.

UPDATE

Кажется, я забыл некоторые основы ... в то время как обсуждение с Малкольмом относительно использования кэширования имеет некоторое значение, как насчет следующего:

Раньше я делал ссылку на внутреннюю страницу, которая открывала бы _blank, принимала идентификатор, выполняла вызов БД для сохранения, а затем перенаправляла пользователя в этом окне на соответствующий URL-адрес.

Я думаю, что это многое проясняет.

Ответы [ 3 ]

3 голосов
/ 15 июня 2011

Нет такого помощника.Я не могу на 100% следить за тем, как вы хотите, чтобы этот сценарий работал, но идея в том, что вы должны использовать jQuery для присоединения к событию click, вызывать некоторый URL-адрес отслеживания через .ajax, а затем возвращать, чтобы обработать исходный щелчок ссылки.


//(this looks somewhat ugly - the point of this is the id parameter at the end to set the link's id)
@Html.ActionLink(Model.dsResults.Tables[0].Rows[i]["title"].ToString(), "LinkClick", new { itemListID = @Model.dsResults.Tables[0].Rows[i]["ItemListID"], id="sweetLink" })

Тогда ваш блок JavaScript где-то после ссылки:



$('#sweetLink').click(function() {
  .ajax( your call here to record the click - ); //use $(this).whatever to access your link properties
   return true;
});

Когда вызов вернется, будет обработан исходный URL-адрес ссылки.

0 голосов
/ 15 июня 2011

Поскольку вы говорите о DataRow, я думаю, вы пришли из ASP.NET и думаете о реализации поведения, похожего на нажатие кнопки внутри решетки данных.

Вы приближаетесь к этому поведению, публикуя значение, содержащее необходимые данные, и после этого выполняете перенаправление на целевое действие. Используйте перегрузку

RouteValueDictionary linkRouteValues ​​= ControllerContext.RouteValues;

linkRouteValues.Add ( "LINKNAME", "Ссылка маме "); linkRouteValues.Add ( "LinkID", "10");

RedirectToAction ( "LinkDisplay", linkRouteValues);

если вам нужно передать параметры целевому действию.

Это часто используемый шаблон - post-redirect-get.

Это означает, что вам понадобится кнопка, а не ссылка.

Может быть, переосмыслить ваше желание не возвращаться к модели и БД (или кешу лучше) после нажатия на ссылку. Это будет способ, который выберет большинство разработчиков ASP.NET MVC.

0 голосов
/ 15 июня 2011

Это зависит от того, что вы готовы предоставить пользователю. Достаточно просто включить URL-адрес в качестве параметра строки запроса в ActionLink и перенаправить на него после записи ссылки, но очевидно, что URL будет виден (и редактируется пользователем).Если вы хотите, чтобы был виден только идентификатор, вам придется вернуться к БД (или кешу) - HTTP не имеет состояния.

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

Фактическое перенаправление / новое окно достаточно простое - установите целевой атрибут html вссылка на действие и метод действия RecordLink возвращают RedirectResult.

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