【问题标题】:call code behind functions with html controls使用 html 控件调用函数背后的代码
【发布时间】:2010-09-27 13:46:21
【问题描述】:

我有一个简单的函数,我想在文件名 Move 后面的代码中调用它 我试图看看如何做到这一点,我没有使用 asp 图像按钮,因为没有尝试使用 asp 服务器端控件,因为它们往往不能很好地与 ASP.net MVC 一起工作。现在它的设置方式会寻找一个名为 Move 的 JavaScript 函数,但我希望它在同一视图后面的代码中调用一个名为 move 的函数

 <img alt='move' id="Move" src="/Content/img/hPrevious.png" onclick="Move()"/>


protected void Move(){

}

//根据搜索条件更新一个新表

 protected void Search(object sender EventArgs e)
{
 for (int i = 0; i < data.Count; i++){
 HtmlTableRow row = new HtmlTableRow();
 HtmlTableCell CheckCell = new HtmlTableCell();
 HtmlTableCell firstCell = new HtmlTableCell();
 HtmlTableCell SecondCell = new HtmlTableCell();
 CheckBox Check = new CheckBox();
 Check.ID = data[i].ID;
 CheckCell.Controls.Add(Check);
 lbl1.Text = data[i].Date;
 lbl2.Text = data[i].Name;
  row.Cells.Add(CheckCell);
  row.Cells.Add(firstCell);
  row.Cells.Add(SecondCell); 
  Table.Rows.Add(row);
}

}

【问题讨论】:

    标签: html asp.net-mvc


    【解决方案1】:

    Scott Guthrie 有一个very good example 说明如何使用路由规则来做到这一点。

    这将使您能够让用户导航到格式为 /Search/[Query]/[PageNumber] 的 URL,例如 http://site/Search/Hippopotamus/3,它会显示河马搜索结果的第 3 页。

    然后在您看来,只需将下一个按钮指向“http://site/Search/Hippopotamus/4”,无需 javascript。

    当然,如果你想使用 javascript,你可以这样做:

    function Move() {
        var href = 'http://blah/Search/Hippopotamus/2';
        var slashPos = href.lastIndexOf('/');
        var page = parseInt(href.substring(slashPos + 1, href.length));
        href = href.substring(0, slashPos + 1);
    
        window.location = href + (++page);
    }
    

    但这比仅仅增加控制器中的页码参数和设置下一个按钮的 URL 要复杂得多。

    【讨论】:

    • 这帮助我理解以不同的方式处理它。谢谢
    【解决方案2】:

    您不能在 ASP.NET MVC 应用程序的 JavaScript 中执行回发或调用视图中的任何内容。您想从 JavaScript 调用的任何内容都必须是控制器上的操作。如果没有更多关于你想要做什么的细节,很难说更多,但是如果你想在你的 web 应用程序中从 JavaScript 调用某个方法“Move”,那么“Move”必须是控制器上的一个动作。

    基于 cmets,我将更新此答案,更完整地描述您如何实施我所理解的问题中描述的问题。但是,这个问题缺少很多信息,所以我在这里推测。希望总体思路能够通过,即使某些细节与 TStamper 的确切代码不匹配。

    让我们从一个控制器动作开始:

    public ActionResult ShowMyPage();
    {
        return View();
    }
    

    现在我知道我想重新显示此页面,并使用从页面中的 JavaScript 函数传递的参数来执行此操作。由于我将再次显示同一页面,因此我将更改操作以进行论证。字符串参数可以为空,因此我可以像往常一样继续进行页面的初始显示,而不必担心为参数指定某种默认值。这是新版本:

    public ActionResult ShowMyPage(string searchQuery);
    {
        ViewData["SearchQuery"] = searchQuery;
        return View();
    }
    

    现在我需要在 JavaScript 中再次调用此页面。因此,我使用最初用于显示页面的相同 URL,但我在查询字符串参数中附加了表名:

    http://example.com/MyControllerName/ShowMyPage?searchQuery=tableName

    最后,在我的 aspx 中,我可以调用代码隐藏函数,从视图数据中传递 searchQuery。再一次,我对在 MVC 应用程序中使用代码背后有强烈的保留意见,但这会起作用。

    如何在aspx中调用代码隐藏函数:

    <% Search(ViewData["searchQuery"]); %>
    

    我改变了论点。由于您不处理事件(除了少数例外,例如 Page_Load,MVC 中没有),因此 Search 函数不需要事件处理程序的签名。但我确实添加了“tablename”参数,以便您可以从 aspx 传递它。

    再一次,我将在后面的代码中表达我对这样做的保留意见。当 MVC 的工作方式不同时,让我感到震惊的是,您正在尝试在 MVC 框架内使用标准 ASP.NET 技术。我强烈建议您阅读 MVC 教程以查看执行此类操作的更标准方法的示例。

    【讨论】:

    • 是的,我知道如何从 $.post("Move"{}); 的控制器调用它有没有办法强制它转到同一视图后面的代码
    • 我想要做的是我在 dode 后面动态绑定一个表,并且我正在从数据库中分页,所以当单击下一个 img 时,我希望它触发一个动作后面的代码在后面的代码中重新绑定一个新表。从控制器我将如何绑定到视图中的表
    • 我更新了第一个问题以显示我如何在 Search 方法中使用 asp:button 绑定表格
    • 好吧,我对在 MVC 应用程序中使用代码隐藏有所保留,您可以完成这项工作。为表名的操作添加一个参数。在您的帖子中调用相同的操作,将新表名作为参数传递。
    • ?我不明白你在说什么
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多