16 Stimmen

MVC 3 (Razor) - Standardmethode zur Verwendung eines Button-Ereignisses zum Aufrufen eines Controllers

Ich habe eine einfache Wall.cshtml-Ansicht, die eine _Search.cshtml lädt Teilweise Ansicht das so aussieht:

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

Die partielle Ansicht _Search.cshtml (aktualisiert auf der Grundlage der Antwort von @Darin) sieht wie folgt aus:

@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>
}

Der Controller sieht folgendermaßen aus:

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

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

Wenn ich die Anwendung ausführe, sieht der resultierende HTML-Block wie folgt aus:

<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>

FRAGE 1: Warum sollte der Klick auf die Schaltfläche nie die Suche nach Controller Methode?
(Ich möchte noch einmal betonen, dass _Search.cshtml eine Teilansicht ist, die innerhalb einer Ansicht namens Wall.cshtml ausgeführt wird).

FRAGE 2: Wie kann ich den Wert im Textfeld "txtSearch" ermitteln?

FRAGE 3: Da dies eine Teilansicht ist, wie mache ich die Ansicht, die die aktuelle Suche Teilansicht enthält ..zu aktualisieren und aktualisieren sich mit dem Ergebnis der Suchabfrage?

17voto

Darin Dimitrov Punkte 990883

Es wäre besser, ein Formular zu verwenden und die Suchschaltfläche zu übermitteln:

@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>
}

Was Ihre zweite Frage anbelangt, so könnten Sie dieses Suchformular AJAXifizieren:

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

donde resultContainer könnte ein Div sein, das die von der Controller-Aktion zurückgegebenen Suchergebnisse beherbergen wird.

2voto

SF Developer Punkte 5116

Das Problem war, dass die <input id="Search" type="button" value="Search" />
hat einen Typ = BUTTON

Ich habe den Typ geändert in EINGABE ...und damit war das Problem behoben.

0voto

florian.isopp Punkte 753

Vergessen Sie nicht, die Daten zu serialisieren, um auch das Modell an die Controller-Aktion zu übergeben:

@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>    
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X