使用MVC从客户端为ViewData分配值

时间:2011-05-24 13:34:16

标签: asp.net-mvc

我继承了一个MVC应用程序,并且是来自ASP.NET环境的真正的新手。我的问题是我无法在部分视图和控制器之间移动可变数据。在ASP.NET中,这非常简单,而不是MVC中的情况。因此,当从客户端选择Tab时会触发以下代码,但我需要从客户端捕获selectedTabIndex值并将其传递给控制器​​。

    function onTabSelect(e) {
    var selectedTabIndex = 0;
    selectedTabIndex = $(e.item).index();
    alert(selectedTabIndex);
    }

我考虑使用ViewData对象,但似乎没有办法从函数中执行此任务分配。所以下面的代码似乎是一个荒谬的任务,无论如何它都会失败。 (记住,我是一个极端的新手)

    function onTabSelect(e) {
    var selectedTabIndex = 0;
    <% =ViewData["selectedTabIndex"]%> = selectedTabIndex;      
    }

我也考虑过使用cookies,但这似乎也不是一种实用的方法。在ASP.NET中,我可以使用.find方法访问客户端控件,但这对我来说是一个陡峭的学习曲线。

我的替代方案是什么?

2 个答案:

答案 0 :(得分:3)

如果用户可以在保存操作之间选择不同的选项卡,则可能需要考虑绑定某种点击功能(使用jQuery)来设置selectedTabIndex javascript变量。或者,您可以将隐藏输入的值设置为选定的选项卡索引。

在任何一种情况下,如果您在提交保存操作时需要控制器中的值(设置ViewData,ViewBag,某些模型数据等),您可以通过$.ajax提交数据并返回一些JSON来自您的控制器

$('#SaveButton').click(function() {
  $.ajax({
    url: '/Controller/Save',
    type: 'POST',
    // you might need to serialize additional data you want to save here
    // but you could create any JSON object before calling $.ajax
    data: {"selectedTabIndex": selectedTabIndex}, // data to POST
    dataType: 'json', // this indicates the type of data returned from controller
    success: function(data) {
      // you didn't really describe how to programatically set a tab,
      // so "setToTab" is a guess
      $('#tabID').setToTab(data.selectedTabIndex);
    }
  });
}

你的控制器可能看起来像

public ActionResult Save(int selectedTabIndex)
{
  // again, you might need different parameters to complete your Save
  return JsonResult(new { selectedTabIndex: selectedTabIndex });
}

答案 1 :(得分:0)

通过HTTP POST将数据发送到控制器。创建一个隐藏的输入<input type="hidden" name="selectedTabIndex"/>,并在POST之前使用javascript设置值。控制器可以从Form参数中提取此值,或者如果方法包含与输入名称匹配的参数,则可以在Action方法中自动填充。

这是answer provided by David的非替代品。