2017-11-19 1 views
0

Ich habe ein Modell auf meiner CSHTML Seite das, was ich auf diese Weise verwenden:Wie man Modellwert in der Javascriptfunktion erhält und es zum Kontroller übergibt?

@model Web.Models.Element 

@using (Html.BeginForm("Search", "Company")) 
{ 
@Html.HiddenFor(c => c.Person) 

<div class="panel panel-default"> 
    <div class="panel-heading"> Company Search</div> 
    <div class="panel-body collapse" id="screenCompanySearch"> 
     <form id="formSearch" name="formSearch" method="post"> 
      <fieldset style="margin: 20px;"> 
       <legend>Search</legend> 

       <div class="row"> 
        <div class="col-xs-2 col-sm-2"> 
         @Html.Label("Company Name") 
         @Html.TextBoxFor(c => c.Company.Name, new { @class = "form-control" }) 
        </div> 
      </fieldset> 
     </form> 
    </div> 
</div> 

Mein Javascript-Funktion durch eine Schaltfläche klicken, um diese Art und Weise aufgerufen:

$("#btnSearch").on("click", function() { searchCompany(); })' 

In meiner JavaScript-Funktion muß ich Holen Sie sich dieses Modell vollständig mit den TextBoxFor Werte geladen:

<script type="text/javascript"> 
function searchCompany() { 
    var data = $("#formSearch").serialize(); 
    $.ajax({ 
     url: "@(Url.Action("SearchCompany", "Company"))", 
     cache: false, 
     data: data, 
     type: "POST", 
     success: alert("sucesso!") 
    }); 
} 
</script> 

Mein Controller-Methode richtig, aber das Modell geführt, in dem Ajax geladen "wird data "-Parameter ist nicht mit den TextBoxFor-Werten gefüllt.

Das ist meine Controller-Action für die Ansicht:

public ActionResult Consulta() 
    { 
     Element model = new Element(); 
     model.Person = new Person(); 

     return View(model); 
    } 

Was passiert ist, dass mein Modell auf meinem Controller-instanziiert wird, aber die Werte aus der TextBoxFor nicht auf den Eigenschaften des Modells erfaßt.

Wie kann ich das lösen? Danke für jetzt.

<div class="col-xs-2 col-sm-2"> 
    @Html.Label("Person Name") 
    @Html.TextBoxFor(c => c.Person.Name, new { @class = "form-control" }) 
</div> 

aktualisiert, so, 'c' gleich mein Element-Objekt. Wenn ich die Controller-Methode "Search" erreiche, instanziiert der über den Ajax-Aufruf übergebene Parameter Element nicht die Element.Person, die mir Person = null gibt.

In meiner Action ich habe:

Element model = new Element(); 
model.Person = new Person(); 

Element Klasse:

public Element() 
{ 
    this.Contacts = new List<Contact>(); 
    this.DataType = new DataType(); 

} 

public int ID_Element { get; set; } 
public int ID_ElementType { get; set; } 

public virtual List<Contact> Contacts { get; set; } 
public virtual DataType DataType { get; set; } 
public virtual Person Person {get; set; } 

Controller Aktion

[HttpPost] 
public JsonResult SearchCompany(Element model) 
{ 
    ... 
} 
+0

Wo und wie rufen Sie die Methode 'searchCompany' js? und was gehst du darauf? – Shyju

+0

Wie in meinem Skript-Abschnitt: $ ("# btnSearch"). On ("click", function() {searchCompany (model)}); @Shyju –

+0

Was ist 'Modell' dort? Ist das dein js Objekt? Fügen Sie Ihrer ursprünglichen Frage den entsprechenden Code hinzu. – Shyju

Antwort

0

Die Serialize-Methode wird Sie die serialisierte Version des Formulars nicht geben, weil Sie haben Formular-Tags verschachtelt.

Die @using (Html.BeginForm("Search", "Company")) wird ein äußeres Form-Tag erstellen und Sie haben Ihre andere Form darin, wodurch eine geschachtelte Formularstruktur erstellt wird. Verschachtelte Formulare sind ungültig. Sie können zwei Formulare auf der gleichen Seite haben, die parallel und nicht verschachtelt sind.

Wenn Sie das verschachtelte Formularproblem beheben, gibt Ihnen die serialize-Methode eine gültige Zeichenfolge für Ihre Formulareingaben.

@using (Html.BeginForm("Search", "Company")) 
{ 
    <!-- Your other form --> 
} 

<form id="formSearch" name="formSearch" method="post"> 
    <fieldset style="margin: 20px;"> 
     <legend>Search</legend> 

     <div class="col-xs-2 col-sm-2"> 
      @Html.Label("Company Name") 
      @Html.TextBoxFor(c => c.Company.Name, new { @class = "form-control" }) 
     </div> 
    </fieldset> 
</form> 

Beachten Sie, dass die serialize-Methode Ihnen die Eingabeelementwerte von Elementen in diesem spezifischen Formular angibt. Wenn Sie einige andere Daten (zB: Id) senden möchten, müssen Sie diese in einem Eingabefeld innerhalb dieses Formulars behalten.

+0

Schön! Jetzt habe ich mein Datenobjekt mit den Werten aus den Eingabefeldern gefüllt! Aber in meiner Controller-Methode nun welches Objekt soll ich als Parameter erhalten? Ich meine, was ich h Um dieses serialisierte Objekt aus dem Formular in mein gewünschtes Modell auf dem Controller zu verwandeln? –

+0

Wenn Sie 'Element' als Parameter Ihrer Aktionsmethode verwenden, kann der Modellbinder die geposteten Daten zuordnen. – Shyju

+0

Wunderbar! In meinem Element-Objekt habe ich ein Objekt Person, das Null wird, selbst wenn dies auf der Controller-Aktionsmethode geschieht: Element model = new Element(); und model.Person = new Person(); Warum passiert das? –

Verwandte Themen