如何在ASP .NET中将变量从View传递给Controller

时间:2015-09-02 18:18:09

标签: javascript html asp.net asp.net-mvc

我发现了与我相似的问题,但在所有这些例子中,变量都是模型的一部分。我试图传递一个在javascript中创建的变量,它不是模型的一部分。

代码:

 $(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 = ???});

    }
});

有没有办法填写???上面的电子邮件?

2 个答案:

答案 0 :(得分:3)

您可以将值作为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;
  }
});

答案 1 :(得分:1)

回答你的问题

  

有没有办法填写???上面的电子邮件?

没有。 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(因为XMLHttpRequests规范化并不好玩),做类似的事情

$(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文件中执行此操作,请将其替换为硬编码字符串(或其他适合您的字符串)。

修改

由于我似乎没有完全得到你想要做的事情,这里是一个根据用户的“类型”返回不同视图的例子:

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 = peter@innotech.com