2009-12-22 142 views
1

我想知道是否可以在单击按钮时调用控制器中的方法。从ASP.NET MVC中单击按钮调用操作方法

我有一个叫做home的视图,当视图加载时,它调用控制器中的Index动作方法。我有一个名为LoadDataButton(HTML或ASP.NET)。当我点击按钮时,我需要在同一个视图中加载一些数据,称为Home

我如何做到这一点?

+1

@engineerachu我编辑了不正确的术语。使用ASP.NET MVC,不要使用ASP.NET控件*按钮或其他*。这不是ASP.NET - Home.aspx不是一个页面 - 它是一个视图。它实际上并不对应于物理页面。这是一个重要的区别。 – 2009-12-22 13:08:40

回答

1

的按钮,它涉及JQuery的或JavaScript来拨打电话,以获得从数据服务器,如果你想以AJAX的形式做到这一点。但最简单的形式是:

<% Html.BeginForm("Action", "Controller"); %> 

<!--Form values in here--> 

<input type="submit" /> 

<% Html.EndForm(); %> 

将调用您的操作方法并调用回发。 System.Web.Mvc.Ajax中有一个AJAX选项,可以使用带有AJAX选项的AjaxForm进行回发异步,并且它很容易设置。我倾向于亲自使用JQuery。

HTH。

0

要做到这一点使用一个简单的职位,你只需要张贴到控制器方法存在的URL。

例如,按照您的Global.asax标准的路线设置“{控制器}/{行动}/{ID}”

如果您有名为“LoadData”,那么你的HomeController类中的控制器方法“d访问它的URL:

/主页/ LoadData

这是你进入你的形式action属性的URL。

您也可以使用AJAX请求点击此URL,以便将数据加载到您正在使用的同一页面而无需任何回发。

使用jQuery,你可以这样做:

$('#myForm').submit(function() { 
        $.post(
          this.action,{params}, 
          function(data){ // do something with return info } 
        } 
+0

是的,我知道我可以使用jQuery来完成,但首先我试图使用asp.net,然后转移到jQuery。 – superachu 2009-12-22 12:22:58

0

定义两个动作一个用于显示空视图和一个用于与列表填充视图:

public ViewResult Empty() 
    { 
     var products = productsRepository.Products.Where(x => x.ProductID == -1); 
     return View(); 
    } 

和:

public ViewResult ListAll() 
    { 
     var products = productsRepository.Products; 
     return View("Empty", products); 
    } 

并在您的视图中Empty.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<DomainModel.Entities.Product>>" %> 

<h2>Empty</h2> 

<table> 
    <tr> 
     <th></th> 
     <th> 
      ProductID 
     </th> 
     <th> 
      Name 
     </th> 
     <th> 
      Description 
     </th> 
     <th> 
      Price 
     </th> 
     <th> 
      Category 
     </th> 
     <th> 
      ImageMimeType 
     </th> 
     <th> 
      Error 
     </th> 
    </tr> 

<% if (Model != null) 
    { 
     foreach (var item in Model) 
     { %> 

    <tr> 
     <td> 
      <%= Html.ActionLink("Edit", "Edit", new { id = item.ProductID })%> | 
      <%= Html.ActionLink("Details", "Details", new { id = item.ProductID })%> 
     </td> 
     <td> 
      <%= Html.Encode(item.ProductID)%> 
     </td> 
     <td> 
      <%= Html.Encode(item.Name)%> 
     </td> 
     <td> 
      <%= Html.Encode(item.Description)%> 
     </td> 
     <td> 
      <%= Html.Encode(String.Format("{0:F}", item.Price))%> 
     </td> 
     <td> 
      <%= Html.Encode(item.Category)%> 
     </td> 
     <td> 
      <%= Html.Encode(item.ImageMimeType)%> 
     </td> 
     <td> 
      <%= Html.Encode(item.Error)%> 
     </td> 
    </tr> 

<% } 
    }%> 

</table> 

<p> 
    <%= Html.ActionLink("List Products", "ListAll")%> 

</p> 

希望这有助于

+0

这是如何工作的?就像点击“ListAll”链接时,“ListAll”方法触发或什么?什么是“ViewResult”类是什么意思? – superachu 2009-12-22 12:22:12

+0

yes当ListAll链接被点击时,调用ListAll方法。 行为方法可能返回其中一个的结果是View的ViewResult返回一个视图Empty.aspx与产品列表ViewModel视图。作为它的节目,你是MVC的新手,所以我建议你看一下http://www.asp.net/MVC,你会发现很棒的视频和教程,你可以在ASP.NET MVC论坛(http ://forums.asp.net/1146.aspx)如果我的程序不够好,可以得到正确的答案。 希望这有助于。 – ali62b 2009-12-23 07:00:20

0

你必须编写你的控制器如下。

public class HomeController : Controller 
{ 

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

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult FetchData() 
    { 
     return Content("Some data..."); 
    } 

} 

然后按如下所示调用所需的操作。

<% using (Ajax.BeginForm("FetchData", new AjaxOptions() { UpdateTargetId = "ContentPlaceHolder", HttpMethod = "Post" })) 
    { %> 
<div id="ContentPlaceHolder"></div> 
<input type="submit" value="Fetch Data" /> 
<% } %> 

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>