2016-12-06 1 views
1

Ich bin neu in asp.net MVC und wollen html Textfeld Wert und senden es an die Steuerung Aktionsmethode Argument, zu diesem Zweck in Sicht Seite schreiben diesen Code lesen:
Wie kann HTML-Textfeld Wert mit Url.Action an Controller-Aktion Methode Eingabeargument senden?

<a href="@Url.Action("Item", "Store", new {parentPartId = @item.Id,UserID=12})">@item.BookName</a> 


in url action in diesem Segment:
UserID = html Textbox Wert
Wert lesen und auf diese Aktion in der Steuerung senden:

public ActionResult Item(int parentPartId,int UserID) 
     { 
} 

diese in Sicht Seite ist mein Textfeld:

<input type="text" id="USERID"/> 


Wie kann ich das Problem lösen Dank?.

+0

Option 1: Fügen Sie das Textfeld in ein Formular und lassen Sie den Benutzer das Formular (über eine Schaltfläche wahrscheinlich), dessen "Aktion" auf die Aktion Methode verweisen du erwähntest. Dies würde dazu führen, dass der Wert im Textfeld als Argument an den Controller übergeben wird. Sie müssen sicherstellen, dass der Name des Textfelds mit dem Parameternamen übereinstimmt. Option 2: Verwenden Sie etwas Javascript, um den Wert des Textfelds zu erfassen, wenn der Benutzer auf den Link klickt. Verwenden Sie das, um den Wert in die URL zu setzen, bevor Sie zulassen, dass der Link ausgelöst wird. – ADyson

+0

@ADyson Wie kann ich die Option 2 verwenden? –

+0

Setzen Sie eine href nicht direkt auf den Link. Handle sein Klick-Ereignis. Verwenden Sie preventDefault, um das normale Redirect-Verhalten zu beenden. Erstellen Sie eine Variable, die den Wert des Helpers "Url.Action" enthält, außer dass Sie "@ item.Id" in eine Platzhalterzeichenfolge wie "PARENT_ID" ändern. Rufen Sie die generierte URL ab und verwenden Sie die Funktion zum Ersetzen von Zeichenfolgen, um PARENT_ID mit dem Wert aus dem Textfeld zu wechseln. Leiten Sie dann den Benutzer zu dieser neu generierten URL um. – ADyson

Antwort

1

Sie können das Click-Ereignis des Hyperlinks verarbeiten und den Wert aus der Textbox in sie injizieren, wie folgt aus:

HTML:

<a class="BookName" href="" data-id="@item.Id">@item.BookName</a> 

Script (vorausgesetzt, dass Sie haben jQuery, aber leicht wieder -writable wenn nicht):

$(".BookName").click(function(event) 
{ 
    event.preventDefault(); 
    var url = '@Url.Action("Item", "Store", new {parentPartId = "PARENT_ID",UserID="USER_ID"})'; 
    url = url.replace("USER_ID", $("#USERID").val()); 
    url = url.replace("PARENT_ID", $(this).data("id")); 
alert(url); //just for debugging 
    window.location.href = url; 
}); 

Sie möchten vielleicht der Eingangswert gilt überprüfen, bevor Sie dies tun, aber das wird Ihnen den Start.

+0

Es ist ein sehr unfruchtbarer Code. –

+0

Danke, ich führe das und erhalte diesen Fehler: Das Parameterverzeichnis enthält einen Nulleintrag für den Parameter 'UserID' des Typs 'System.Int32', der keine Nullwerte zulässt, für die Methode 'System.Web.Mvc.ActionResult Item (Int32, Int32)' in 'StoreProject.Controllers.StoreController'. Ein optionaler Parameter muss ein Referenztyp, ein Nullable-Typ oder ein optionaler Parameter sein. Parametername: Parameter –

+0

@behibeheh hast du definitiv eine Zahl in das USERID Textfeld geschrieben, bevor du klickst? Ich habe eine "Warnung" in den Code eingefügt, damit wir überprüfen können, ob die URL vor dem Senden richtig aussieht. Wenn es ein Problem gibt, wäre es gut, die Ausgabe hier zu posten, damit wir sie überprüfen können. – ADyson

1

Der Textfeldwert ist dynamisch. Es hängt von Benutzereingaben ab. Razor-Tags werden auf dem Server kompiliert und auf dem Client veröffentlicht. So kann Ihr Rasierklingencode nicht verstehen, was der Benutzer mit Ihrem Textbereich machen wird. Sie benötigen eine Aktion, um die Methode auszulösen, die das Bestimmen der Textfeldwerte und das Senden an den Server enthält. Sie können die Ajax-Funktion verwenden. Mit Jquery's Hilfe.

Ich denke @item ist eine Schleifenvariable. Sie können Ihren Code wie

unten ändern
<a onClick="myFunction(@item.id)">@item.BookName</a> 

wie Sie sehe ich die ID fangen und geben Sie als Paramenter nach unten. ist dies Ihre Textbereich

<input type="text" id="USERID"/> 

dies ist die Javascript-Funktion, die die Textbox Wert bekommt und sendet sie an Ihre Aktion

function myFunction(id){ 
    var userId = document.getElementById("UserID").value; 
    var data ={ 
     parentPartId:id, 
     UserID:userId 
    } 

    $.ajax({   //Jquery stuff 
      url : '/Store/Item' 
      type:'POST', 
      data:data 
      dataType:'json' 
      success:function(){//You can handle succes scenario} 
     }); 
} 

Siehe die Struktur der Daten ist ein JSON-Objekt. Und Parameternamen sind die gleichen wie Ihre Aktionsparameter. Wenn Sie es senden. MVC wird die Logik verstehen und die Parameter und Werte anpassen.

)
+0

Dies reproduziert nicht direkt das gleiche Verhalten - eine Ajax-Anfrage ist nicht das Gleiche wie eine Umleitung, die durch Klicken auf einen Link ausgeführt wird. Und wenn Sie ein Beispiel geben wollen, das jQuery (die .ajax-Funktion) erfordert, warum verwenden Sie nicht die jQuery-Syntax, um den Event-Handler zu deklarieren? Inline-Ereignisse werden im Allgemeinen als schlechte Praxis angesehen, jQuery oder nicht. Verwenden Sie außerdem URL.Action, um sicherzustellen, dass die richtige URL generiert wird, andernfalls könnte sie je nach Konfiguration des MVC-Routings und der Einrichtung in der bereitgestellten Umgebung falsch sein. – ADyson

+0

Ich habe meinen Beitrag über jquery bearbeitet. Auf der anderen Seite glaube ich nicht, dass es ein "generierendes" Problem gibt. Warum sollte es sein? –

+0

Wie ich bereits sagte, könnte ein Problem auftreten, wenn eine andere Routing-Konfiguration als die Standardkonfiguration verwendet wird oder wenn die Site nicht im Stammordner der IIS-Website/des virtuellen Verzeichnisses bereitgestellt wird. Sie können nicht davon ausgehen, dass die Formel zum Abrufen der URL einer Aktion immer so einfach ist. Es gibt viele Fragen zu SO, wo Menschen damit Probleme hatten. – ADyson

-1

Sie benötigen Formular platzieren und veröffentlichen Sie Ihre Daten über Modell/Form Sammlung

Ansicht Code

@using (Html.BeginForm("SaveData", "TestCont", FormMethod.Post, new { Id = "frmTest", enctype = "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 
    <input type="text" id="USERID" name="UserID"/> 
} 

Controller:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult SaveData(FormCollection form) 
{ 
    string html = Convert.ToString(form["UserID"]); 
} 

stellen Sie sicher, [ValidateInput(false)] zu markieren sonst wird es Fehler aus auf der Buchung html

Sie können als platzieren Schaltfläche 1 in Form einfügen oder in JavaScript verwenden $('#frmTest').submit()

+1

'enctype =" multipart/form-data "' ist hier nicht notwendig, es ist nur erforderlich, wenn Sie Dateien hochladen. Und was ist "FormCollection"? Diese Methodensignatur unterscheidet sich vom Beispiel des OP, und Sie rufen die Benutzer-ID auf eine seltsame Weise ab, indem Sie den MVC-Modellbinder ohne ersichtlichen Grund umgehen. – ADyson

+0

ja, das kann entfernt werden, wenn Sie keine Datei hochladen –

+1

Ich bin nicht kleinlich, ich habe nur darauf hingewiesen, dass es einige Dinge, die ich glaube nicht, sind richtig mit dem Code, wie die Art, wie Sie die umgehen Modellbinder und Unterdrückung der integrierten Validierung - warum würden Sie wertvolle Sicherheits- und Gesundheitsüberprüfungsfunktionen wegwerfen, die in das Framework integriert sind? Es gibt nichts Seltsames an diesem Szenario, das dies rechtfertigen würde, es ist eine sehr übliche Situation, einige einfache Daten zu übermitteln. – ADyson

Verwandte Themen