MVC 3(Razor) - 使用Button事件调用Controller的标准方法

时间:2011-04-06 04:41:50

标签: asp.net-mvc-3

我有一个简单的Wall.cshtml视图,可以加载_Search.cshtml 部分视图,如下所示:

<h2>The Wall</h2>
@{Html.RenderPartial("~/Views/Search/_Search.cshtml");}

_Search.cshtml部分视图(基于@Darin回复更新)如下所示:

@using (Html.BeginForm("Searching", "Search", FormMethod.Post, new { id = "searchForm" }))    
{  
    <div id="search">
        <div id="searchbtn">
           <input id="Search" type="button" value="Search" />
        </div>
        <div id="searchtxt">
           @Html.TextBox("txtSearch")
        </div>
  </div>
}

控制器如下所示:

public class SearchController : Controller
{
    public ActionResult Wall()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Searching()
    {
        // do something with the search value
        return View();
    }
}

当我运行应用程序时,生成的HTML块看起来像这样:

<form action="/Search/Searching" id="searchForm" method="post">  
   <div id="search">
      <div id="searchbtn">
          <input id="Search" type="button" value="Search" />
      </div>
      <div id="searchtxt">
          <input id="txtSearch" name="txtSearch" type="text" value="" />
      </div>
   </div>
</form>

问题1:为什么按钮点击永远不会点击搜索控制器方法?
(让我重申一下,_Search.cshtml是一个在名为Wall.cshtml的视图中运行的部分视图)。

问题2:如何在“txtSearch”文本框中获取值?

问题3:由于这是一个部分视图,如何创建包含当前搜索部分视图的视图..以使用搜索查询的结果刷新和更新自身?

3 个答案:

答案 0 :(得分:17)

最好使用表单并提交搜索按钮:

@using (Html.BeginForm("Search", "Home", FormMethod.Post, new { id = "searchForm" }))    
{
    <div id="search">
        <div id="searchbtn">
            <input id="Search" type="submit" value="Search" />
        </div>
        <div id="searchtxt">
            @Html.TextBox("txtSearch")
        </div>
    </div>
}

就您的第二个问题而言,您可以AJAXify此搜索表单:

$(function() {
    $('#searchForm').submit(function() {
        $.ajax({
            url: this.action,
            type: this.method,
            success: function(result) {
                $('#resultContainer').html(result);
            }
        });
        return false;
    });
});

其中resultContainer可能是一些div,它将包含从控制器操作返回的搜索结果。

答案 1 :(得分:2)

问题在于<input id="Search" type="button" value="Search" />
有一个类型= 按钮

我将类型更改为 INPUT ...并解决了问题。

答案 2 :(得分:0)

不要忘记序列化数据以将模型推送到Controller Action:

@model CBS.DataAccess.Entities.SupplierQuoteEntity     
@using (Html.BeginForm("Create", "SupplierQuote", FormMethod.Post, new { id = "SupplierQuoteCreateForm" }))
{ 
    <div>blablablabla fields...</div>

    <a class="t-button t-button-icontext" onclick="ajaxSubmit()"><span class="t-icon t-insert"></span>Create</a>  

    <script type="text/javascript">
        function ajaxSubmit() {
            var formData = $("#SupplierQuoteCreateForm").serializeArray();

            $.ajax({
                type: "POST",
                url: '@Url.Action("Create", "SupplierQuote")',
                data: formData,
                dataType: "json",
                success: function (data) {
                    alert(data);
                }
            });
        }        
    </script>    
}