2015-09-02 4 views
0

Я нашел похожие вопросы для моего, но во всех этих примерах переменная была частью модели. Я пытаюсь передать переменную, созданную в javascript, которая не является частью модели.Как передать переменную из View в Controller в ASP .NET

Код:

$(document).ready(function() { 

    var url = document.URL; 
    var index = url.indexOf("?email="); 
    var email; 

    /* If there is an EMAIL in URL, check directory to confirm it's valid */ 
    if (index > -1) { 
     /* There is an email */ 
     email = url.substr((index + 7)); 
     email = email.substr(0, (email.length - 4)) + "@@mymail.ca"; 

     /* Check directory to see if this email exists */ 
     @Html.Action("CheckDirectory", "Home", new { email = ???}); 

    } 
}); 

Есть ли способ, чтобы заполнить в ??? с электронной почтой выше?

+0

Это использование '@ Html.Action()' не иметь смысл.Это приведет к синтаксической ошибке на клиентском JavaScript. Что касается «передачи значения», вы можете обновить разметку на стороне клиента с помощью JavaScript. Поэтому, если есть что-то, что можно отправить в контроллер, вы можете установить его по URL-адресу в разметке или установить значение элемента формы для сообщения формы. Или, возможно, вы хотите сделать запрос AJAX к методу контроллера для выполнения какой-либо операции? Не совсем понятно, что вы даже пытаетесь сделать здесь. – David

+2

Вам нужно узнать об AJAX. – SLaks

+0

@David У меня есть планировщик Kendo на этом представлении, что позволит людям создавать заказы, если у них есть действительная учетная запись. Чтобы проверить каталог учетных записей, я должен перейти к внешнему URL-адресу списка писем электронной почты (идентификаторы учетных записей). Поэтому, прежде чем загружать планировщик, я пытаюсь вызвать «CheckDirectory» на Домашнем контроллере, чтобы проверить, действительно ли электронная почта верна. – dexter

ответ

0

Чтобы ответить на ваш вопрос

Есть ли способ, чтобы заполнить в ??? с электронной почтой выше?

№ Код Razor похож на, скажем, на PHP или на любой другой серверный язык шаблонов - он оценивается на сервере до отправки ответа. Так что, если у вас что-то вроде

@Url.Action("checkdirectory", "home") 

в вашем скрипте, при условии, что это непосредственно в представлении, он получил бы заменить на сгенерированном URL, как

/home/checkdirectory 

Ваш код, который использует

@Html.Action("checkdirectory", "home") 

фактически выполняет отдельное действие и вводит ответ как строку в вид, где он вызывается. Наверное, не то, что вы намеревались.

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

[HttpGet] 
public ActionResult CheckDirectory(string email = "") 
{ 
    bool exists = false; 

    if(!string.IsNullOrWhiteSpace(email)) 
    { 
     exists = YourCodeToVerifyEmail(email); 
    } 

    return Json(new { exists = exists }, JsonRequestBehavior.AllowGet); 
} 

вы можете, используя JQuery (потому что запросы XMLHttpRequest не весело нормализовать), сделать что-то вроде

$(function(){ 

    var url = '@Url.Action("checkdirectory", "home")'; 

    var data = { email : $('#email').val() }; 

    $.get(url, data) 
     .done(function(response, status, jqxhr) { 

      if(response.exists === true) { 
       /* your "email exists" action */ 
      } 
      else { 
       /* your "email doesn't exist" action */ 
      } 

     }) 
     .fail(function(jqxhr, status, errorThrown) { 
      /* do something when request errors */ 
     }); 

}); 

Это подразумевает, что вы имеете <input /> элемент с id из email. Отрегулируйте соответствующим образом. Кроме того, помощник Url может использоваться только в представлении; если вы делаете это в отдельном файле JavaScript, замените его на жестко закодированную строку (или что-то еще для вас).

Edit:

Так как кажется, я не совсем получить то, что вы пытаетесь сделать, вот пример возвращения другого вида на основе «типа» пользователя:

public ActionResult ScheduleMe(string email = "") 
{ 
    if(!string.IsNullOrWhiteSpace(email)) 
    { 
     ActionResult response = null; 
     var userType = YourCodeToVerifyEmail(email); 

     // Assuming userType would be strings like below 
     switch(userType) 
     { 
      case "STAFF": 
       response = View("StaffScheduler"); 
       break; 

      case "STUDENT": 
       response = View("StudentScheduler"); 
       break; 

      default: 
       response = View("ReadOnlyScheduler"); 
       break; 
     } 

     return response; 
    } 

    return View("NoEmail"); 
} 

Предполагается, что у вас будет 4 возможных вида: три упомянутых вами плюс «ошибка», когда не задан параметр электронной почты (вы также можете обработать это путем перенаправления на другое действие). Этот вариант также предполагает, что пользователь каким-то образом перешел к чему-то вроде hxxp: //yourdomain.tld/home/scheduleme? [email protected]

+0

Спасибо !!! Довольно много скопировано и работает отлично. – dexter

+0

@ UğurDinç Объяснения имеют смысл? Кроме того, вам нужно будет прочитать некоторые сведения о том, почему [JsonRequestBehavior.AllowGet' был необходим для результата действия] (http://stackoverflow.com/questions/8464677/why-is-jsonrequestbehavior-needed) - структура MVC имеет некоторые проблемы, когда дело касается обработки значений JSON. –

+0

Новая проблема заключается в том, что ответ приходит (~ 5) секунд после загрузки View, тогда как представление должно было зависеть от ответа. I.Если письмо принадлежит STAFF, загрузите Staff Scheduler (без ограничений), иначе, если адрес электронной почты принадлежит STUDENT, загрузите Scheduler для учащихся (ограниченное использование), иначе загрузите View Scheduler (не редактируемый). – dexter

2

Вы можете передать значение в качестве параметра GET в URL контроллера:

$(document).ready(function() { 

    var url = document.URL; 
    var index = url.indexOf("?email="); 
    var email; 

    /* If there is an EMAIL in URL, check directory to confirm it's valid */ 
    if (index > -1) { 
    /* There is an email */ 
    email = url.substr((index + 7)); 
    email = email.substr(0, (email.length - 4)) + "@@mymail.ca"; 

    /* Check directory to see if this email exists */ 
    window.location.href = '/CheckDirectory/Home?email=' + email; 
    } 
}); 
Смежные вопросы