2010-08-16 38 views
1

我需要从视图传递一个url字符串到控制器,这是一个通过jquery获取的url。我尝试在默认路由中使用id参数,但那不起作用。它不接受一个url字符串。通过MVC 2中的jquery从视图传递参数到控制器

通过调用jQuery的控制器正常工作,是这样的:

$('#result').load('Home/Files/' + url); 

这就需要正确的操作方法,但除非我喂一个简单的文本字符串,它不会工作(我测试喂养URL变量简单的字符串只是为了确保方法被调用)。

那么我怎样才能得到这个url字符串到控制器?我正在考虑如何做到这一点“MVC”的方式,而不是打破这种思维方式,所以我不想在runat服务器上使用隐藏的输入。它可以通过ViewData完成吗?我想不出任何方式,我只知道如何在控制器中设置ViewData并从视图中获取值,而不是反过来......

我也尝试添加一个自定义路由默认路由):

routes.MapRoute(
    "FileManager", // Route name 
    "Home/{action}/{url}", // URL with parameters 
    new { controller = "Home", action = "Files", url = "" } // Parameter defaults 
); 

但是,这也没有工作,同样的问题没有得到的URL到控制器。我只是这么做的,因为我曾在这里看到过类似问题的人的建议,但说实话,我不明白这是如何工作的,因为这与默认路线有什么不同?我不知道为什么{id}参数似乎只接受某些字符串(id格式字符串,我想),但除非我能指定什么类型的url参数应该是我不明白如何添加此路线应该有任何区别...

如果有人能够启发我,我将非常感激!

编辑︰ 当我想到它,因为我通过与jQuery的ajax调用获取内容,我不知道一个ViewData类型的解决方案无论如何将工作,因为整个页面不张贴,或我错了吗?请记住,我现在只是在学习MVC和jQuery,所以请不要假设我已经掌握了所有的基础知识:-)。基本上,我只希望能够通过任何类型的字符串(和可能的其它类型的数据,是不是一个id)来从视图中的控制器...

编辑2: 我尝试了建议encodeURIComponent方法,但那也没用,除非我做错了什么。这里是我的代码:

的网址(如果我尝试它作为一个相对路径或使用文件的绝对一个也无所谓:///)

<li><a href="#" rel="visual studio 2010/Projects/JsTree/JsTree/">Some text</a> 

jQuery的:

var url; 
$(document).ready(function() { 
    $("a").click(function() { 
     url = encodeURIComponent($(this).attr("rel")); 
     $('#result').load('Home/Files/' + url); 
    }); 
}); 

我使用字符串id参数调用操作方法。请再次注意,如果我传递一个简单的字符串,并且对该操作进行调用,则它工作正常。但是,如果我使用上面的URL,操作方法甚至永远不会被调用......我有一个断点,如果参数中存在url,永远不会到达该断点!

回答

1

这很可能是网址编码不正确 - 尝试使用encodeURIComponent()。

另一个技巧是使用MVC路由本身产生作用的URL - URL.ForAction()IIRC - 这样一来,如果你改变你的路由信息​​,所有的jQuery将继续努力

+0

与上述Nick相同的评论:我真正要问的是,你将如何能够传递其他类型的字符串,不仅是url,还有字符串,包含空格,系统文件路径,你有什么...? – Anders 2010-08-17 07:17:26

+0

完全相同的机制。名称中引用的URI指的是它在URL中传递的方式_NOT_,它是一个正在编码的URL - 因此可以用这种方式对任何数据进行编码。对此的通用JavaScript方法是escape(),但doens不能很好地处理unicode。请参阅http://xkr.us/articles/javascript/encode-compare/以获得更多信息 – Basic 2010-08-17 13:45:02

+0

你最终会得到如下结果: .load('Home/Files /'+ encodeURIComponent(url)+ '/'+ encodeURIComponent(SomeOtherParameter)); – Basic 2010-08-17 13:46:58

0

尝试编码URL您通过encodeURICompoenent()通过它之前是这样的:

$('#result').load('Home/Files/' + encodeURIComponent(url)); 

此编码任何复杂的字符串传递作为最后一个参数,如果我理解正确您的问题,这应该帮助。

+0

好吧,我我会检查一下。我假设你的意思是我应该使用{id}参数的默认路由来做到这一点?但是可能想要传递的其他参数呢?例如,我尝试传递一个带空格的字符串。它会传递给action方法,但会在第一个空格处被切断。如果我需要传递可能成为问题的系统文件路径。那么如何通常能够传递任何类型的字符串(或其他类型的字符串)呢? – Anders 2010-08-17 07:13:36

相关问题