Как я могу получить значение тега HTML для отправки HTML .Action () - PullRequest
1 голос
/ 09 января 2020

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

<span 
  class="close-modal"
  onclick="@Html.Action("SaveNotes", "CallCenter", new { activityId = item.callIdKey, noteText = "test1" })">
  &times;
</span>
&nbsp;
Notes: <br />
<textarea name="paragraph_text" rows="5" style="width:90%">
  @item.NoteText 
</textarea>

Я хотел бы заменить test1 из переменной маршрута noteText и вместо этого изменить его на любое значение в теге <textarea>.

Есть ли элегантный способ сделать это без написания гигантского блока кода jQuery?

Ответы [ 2 ]

1 голос
/ 09 января 2020

A @ gunr2171 отмечает в комментариях, что единственный способ динамически обновить ссылку после ее отображения в браузере - это использовать некую форму сценариев на стороне клиента, обычно JavaScript. В вашем случае я бы рекомендовал сделать что-то вроде этого:

<span 
  class="close-modal" 
  data-href-template="@Url.Action("SaveNotes", "CallCenter", new {activityId = item.callIdKey, noteText="{note}"})"
  >
  &times;
</span>

Примечание: Как отмечает @HBlackorby в своем ответе, вы не должны использовать @Html.Action() Вот; Я предполагаю, что вы имели в виду @Url.Action().

Таким образом, у вашего JavaScript есть шаблон (data-href-template), с которым он может работать с четко определенным токеном ({note}) для замены, вместо того, чтобы анализировать URL-адрес, чтобы определить, где находится ранее замененный текст. В противном случае вы потенциально попадете в сценарий, в котором вы наберете, например, CallCenter в свой <textarea />, и теперь это неоднозначная ссылка, которую вы не можете просто заменить вслепую. Или, что еще хуже, вы набираете «а», и это действительно неоднозначно.

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

$(document).ready(function () {
  $('span.close-modal').click(function() {
    var noteInput    = $('textarea[name="paragraph_text"]');
    var encodedNote  = encodeURI(noteInput.text());
    var template     = $(this).data("href-template");
    var targetUrl    = template.replace("{note}", encodedNote);
    window.location.href = targetUrl;
  });
});

Вы также можете сделать это без jQuery, очевидно - и должно, если вы уже не зависите от этого. Суть в том, чтобы проиллюстрировать, что это не обязательно должен быть «гигантский блок кода jQuery». На самом деле, это можно сделать всего за несколько строк - и, вероятно, так и должно быть. Я специально разбил его на несколько этапов и переменных для удобства чтения.

1 голос
/ 09 января 2020

@Html.Action() представляет частичное представление в виде строки HTML во время обработки страницы (на стороне сервера). Он больше не существует в разметке после отправки страницы в браузер. Вы не можете делать то, что вы пытаетесь сделать таким образом. По крайней мере, я уверен, что вы не хотите визуализировать частичное представление внутри события onclick вашего тега <span>.

Почему бы вместо этого не использовать помощник HTML для <textarea> тег? Затем вы можете получить любое значение, введенное пользователем в коде сервера. Вы захотите сделать так, чтобы форма отправлялась обратно на сервер по элементу close-modal:

<span class="close-modal" onclick="$('form').submit()">&times;</span>&nbsp;
<form method="post" action="@Url.Action("SaveNotes", "CallCenter", new { activityId=item.callIdKey }">
  Notes: <br />
  @Html.TextArea("noteText", item.NoteText, new { rows="5", style="width:90%" }) 
</form>

Это предполагает, что у вас уже есть jQuery (общее предположение с ASP. NET). Вам могут не понадобиться теги <form>, если у вас уже есть форма на вашей странице.

...