2013-04-29 48 views
2

在我的MVC视图内我有一个按钮单击执行的JavaScript。我试图设置一个字符串到随机设置的字符,我可以很好地工作,但是当我尝试将该字符串设置为JavaScript中的'randomchars'字符串时,我尝试运行视图时遇到NullReferenceException。在ASP.NET MVC的JavaScript函数中设置字符串给NullReferenceException

下面是代码片段,CreateRString是模型参数(RString)被设置为随机字符串的位置。

<script type="text/javascript"> 
    function showAndroidToast(toast) { 

     var url = '@Url.Action("CreateRString", "Functions")'; 
     $.ajax({ url: url, success: function (response) { window.location.href = response.Url; }, type: 'POST', dataType: 'json' }); 

     var randomchars = '@(Model.RString)'; 
    } 
</script> 

语法是否正确?我不太确定为什么它会得到NULL。

回答

2

在页面被传送到客户端(即web浏览器)之后执行javascript。您的剃须刀代码在页面发送到客户端之前在服务器上执行。因此,您尝试访问Model.RString

为了解决这个问题,您可以调用CreateRString在服务器上,也可以通过在成功回调响应集randomchars后的AJAX方法执行。

进一步解释选项2。你可以做这样的事情:

//Action Method that returns data which includes your random chars 
public JsonResult CreateRString() 
{ 
    var myRandomChars = "ABCDEF"; 
    return new JsonResult() { Data = new { RandomChars = myRandomChars } }; 
} 

//The ajax request will receive json created in the CreateRString method which 
//contains the RandomChars 
$.ajax({ url: url, success: function (response) { 
    var randomchars = response.Data.RandomChars; 
    window.location.href = response.Url; 
}, type: 'POST', dataType: 'json' }); 

更具体地说,剃刀调用@Url.Action("CreateRString", "Functions")@(Model.RString)首先在服务器上执行。

然后showAndroidToast在你调用它时在客户端的浏览器中执行。

+1

感谢您的回复,很遗憾,我无法在服务器上创建随机字符串,因为它需要是客户端特定的。当你说我可以在成功回调中设置“randomchars”时 - 我该如何去做这件事?我所知的将'randomchars'设置为'Model.RString'的唯一方法是使用'@(Model.RString)'的razor方法,该方法将尽早执行。 – benallansmith 2013-04-29 23:45:47

+1

如果需要特定于客户端,则可以在服务器端使用C#GUID。如果您需要只能在浏览器中获得的信息,那么您需要使用javascript创建您的随机数或通过发送一个将信息传递给控制器​​的ajax请求。但我想我可能不会理解你说的一切。 – 2013-04-29 23:57:39

+1

是的,这就是我所说的。由于您的洞察力,我现在可以开展工作。我用javascript创建了randomchars,见[这个问题](http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript)。然后我使用ajax'data:{'RString':RString}将控制器传递给控制器​​,允许我的控制器使用该字符串。 – benallansmith 2013-04-30 00:37:36