2010-10-24 62 views
1

我想通过使用jQuery $ .ajax将两组文本框的内容传递给我的控制器上的一个操作。代码我至今如下(所有的缩写为了便于阅读):

在我的html:

<div class="venue-holder"> 
    <input class="tb-venue" id="venue" name="venue" readonly="readonly" type="text" value="Esfahan" /> 
    <input class="oldVenue" id="oldvenue" name="oldvenue" type="hidden" value="Shiraz" /> 
    <input class="tb-venue" id="venue" name="venue" readonly="readonly" type="text" value="Tehran" /> 
    <input class="oldVenue" id="oldvenue" name="oldvenue" type="hidden" value="Tabriz" /> 
</div> 

在我的控制器:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult UpdateVenue(string[] venue, string[] oldvenue) 
{ 
    // do some stuff... 
} 

在我jQuery:

$('form#formUpdateVenue').submit(function(event) { 
    event.preventDefault(); 
    var venue = $('input[name=venue]'); 
    var oldvenue = $('input[name=oldvenue]') 
    $.ajax({ 
     url: '/Admin/UpdateVenue', 
     type: 'POST', 
     dataType: 'json', 
     data: {venue: venue, oldvenue: oldvenue}, 
     success: alert() 
    }); 

问题:

上面显示的jquery不起作用。当我提交网页“挂起”并且我的控制器上的操作未被调用时。

但是,如果我有任何的替代data:部分下面的一切工作正常:

data: venue, 

或:

data: old venue, 

换句话说,我可以在一组文本框的传递给我的行动和调试我确认我得到正确值的字符串数组。

但是,当我试图通过这两个我得到一个错误。我试过以下所有无效:

data: {venue: venue, oldvenue: oldvenue}, 
data: {venue, oldvenue}, 

我该如何传递两个数组?

解决 - 更新基于输入来自达林jQuery的

$('form#formUpdateVenue').submit(function(event) { 
    event.preventDefault(); 
    var tb = $('input[name=venue]'); 
    var tbVenue = new Array(); 

    tb.each(function() { 
     tbVenue.push($(this).val()); 
    }); 

    var tbOld = $('input[name=oldvenue]'); 
    var tbOldVenue = new Array(); 

    tbOld.each(function() { 
     tbOldVenue.push($(this).val()); 
    }); 


    $.ajax({ 
     url: '/Admin/UpdateVenue', 
     type: 'POST', 
     dataType: 'json', 
     data: { venue: tbVenue, oldvenue: tbOldVenue }, 
     traditional: true, 
     success: alert('Ok') 
    }); 
}); 
+0

您的意思是通过AJAX调用传递整个jQuery对象吗?通常你只会传递这些值。 $(...)。val() – 2010-10-24 20:26:32

+0

是 - 我的意思是$(...)。val()... – 2010-10-25 08:31:27

回答

3

试试这个:

$.ajax({ 
    url: '/Admin/UpdateVenue', 
    type: 'POST', 
    dataType: 'json', 
    data: { venue: [ 'elem1', 'elem2' ], oldvenue: [ 'elemA', 'elemB' ] }, 
    traditional: true, 
    success: function(result) { 
     alert('ok'); 
    } 
}); 

公告venueoldvenue参数必须是数组而不是字符串,就像你的情况一样。您只需从输入字段的值中复制它们即可返回单个字符串。所以,如果你想要一个数组,你需要构造一个JavaScript数组对象。

另请注意,如果使用jquery 1.4及更高版本,则成功执行模型绑定所需的配置值为traditional: true

+0

达林 - 这是有道理的,我会试一试。我曾尝试将我的文本框的值放入一个数组中,并将其传递给控制器​​,但这对我无效。请参阅我使用的jQuery代码的更新后的文章... – 2010-10-25 07:24:52

+0

根据您的输入我已经解决了我的问题(请参阅更新后的文章)。按照你的建议,我把我的文本框的值放入数组中。感谢您花时间帮助解决这个问题。非常感激。 – 2010-10-25 19:43:13

0

残,

第一件事,我注意到有关在div上面的HTML,是重复的标识(ID =“会场“ - id =”oldvenue“)。这会导致你的问题。我认为你最好先排序。然后,看看小提琴手或萤火虫,你会看到你的ajax调用中发生的错误。我的'猜测'是你的'路线'可能还需要在global.asax文件中进行调整,然后你的动作'应该'(希望)会正确激发。

正如我所说的,萤火/小提琴手救援也许......

[编辑] - 有几个“明显”的进一步思考。你尝试以下操作签名:

public ActionResult UpdateVenue(FormCollection collection) 

,然后检查请求这样:

var venue = collection["venue"]; 
var oldVenue = collection["oldvenue"]; 

等等,等等。见例如在:

http://code-inside.de/blog-in/2009/04/06/howto-from-the-view-to-the-controller-in-aspnet-mvc-with-modelbinders/

也,看$ AJAX序列化()方法,在你的代码中使用:

http://api.jquery.com/serialize/

+0

Jim - 感谢您的输入。我会尝试你的收藏想法,看看它是如何工作的。请注意,我不能使用serialize(),因为texboxes不在我的Html.Beginform中... – 2010-10-25 11:03:48

+0

Jim - 您提出的ID点的快速问题。我明白每个ID都应该是唯一的,这被认为是最佳做法。也就是说,如果我引用我的文本框的唯一方法是通过jQuery使用name属性,那么重复ID的后果是什么?我的html呈现良好,jQuery确实按照预期捕获了textBox值... – 2010-10-25 19:19:09

+0

剩余 - 如果您总是按名称引用并且将成为该项目中唯一的开发人员,那么我认为这样做很好你在做。但是,如果涉及多个开发人员,那么我认为在做这种事情时应该采用一套标准。这些应该从字面上详细记录下来,在上述情况下,可以使用重复的ID。这实际上只是一个采取实践并且严格的做法。除非它被很好地理解和记录,否则我不会以这种方式去做这件事。 – 2010-10-25 19:34:44

相关问题