2009-07-14 27 views
2

ok. einfach eine, die mein GehirnMehrere Parameter an einen Controller übergeben?

Ich habe eine Methode wickelt, die ich in der Steuerung

public ActionResult Details(string strFirstName, string strLastName) 
{ 
     return View(repository.getListByFirstNameSurname(strFirstName, strLastName) 
} 

Wie erhalte ich mehrere Parameter aus der URL auf den Controller haben?

Ich möchte nicht den QueryString verwenden, da es scheint, nicht-MVC Geist gesetzt zu sein.

Gibt es eine Route? Oder andere Mechanismen, um das zu schaffen? Oder bin ich etwas fehlt altogehter hier mit MVC

EDIT

die URL, die ich versuche, ist

http://site.com/search/details/FirstName and Surname 

so wenn dies klassische asp

http://site.com/search/details?FirstName+Surname 

Aber ich fühle, dass Ich habe etwas übersehen, was ich in meiner Eile, zum Arbeitscode zu kommen, übersehen habe, dass es wirklich eine Put-Anfrage geben sollte - und ich sollte das aus der Formsammlung sammeln.

Obwohl könnte sich lohnen, zu sehen, ob dies getan werden kann - für die Zukunft =>

+1

Bei der PUT-Anforderung müssen Sie nur Eingaben mit den Namen "strFirstName" und "strLastName" im Formular haben. DefaultModelBinder sollte sie an Ihre Aktionsparameter binden –

Antwort

0

Verwenden versteckte Werte in Form

<%= Html.Hidden("strFirstName", Model.FirstName)%> 
<%= Html.Hidden("strLastName", Model.LastName)%> 

und das Modell Bindemittel die Bindung

public ActionResult Details(string strFirstName, string strLastName) 
{ 
     return View(repository.getListByFirstNameSurname(strFirstName, strLastName) 
} 
0

Es ist auch möglich, Formcollection zu verwenden:

public ActionResult Details(int listId, FormCollection form) 
{ 
    return View(rep.getList(form["firstName"], form["lastName"]) 
} 

Ebenso, wenn die HTTP-Anforderung ein Formular Wert enthält mit exakt demselben Namen (Groß- und Kleinschreibung wird berücksichtigt), wird es automatisch an die ActionResult-Methode übergeben.

Auch, um klar zu sein, gibt es nichts un-MVC über Querystring-Parameter.

2

So ähnlich?:

routes.MapRoute("TheRoute", 
    "{controller}/{action}/{strFirstName}/{strLastName}", 
    new { controller = "Home", action = "Index", strFirstName = "", strLastName = "" } 
); 

oder:

routes.MapRoute("TheRoute2", 
    "people/details/{strFirstName}/{strLastName}", 
    new { controller = "people", action = "details", strFirstName = "", strLastName = "" } 
); 

AKTUALISIERT:

Diese Route vor "Default" Route platziert werden soll:

// for urls like http://site.com/search/details/FirstName/Surname 
routes.MapRoute("TheRoute", 
    "search/details/{strFirstName}/{strLastName}", 
    new { controller = "search", action = "details", strFirstName = "", strLastName = "" } 
); 

routes.MapRoute("Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = "" } 
); 
+0

der zweite Parameter das ActionResult ist immer Null. Die URL ist auch falsch/Vorname/Nachname, was bedeutet, dass es ein ActionResult für den Nachnamen geben sollte. Ich versuche beides zu tun? –

+0

Könnten Sie ein Beispiel für eine URL für Ihre Aktion posten? –

+0

Das Platzieren der benutzerdefinierten Route vor der "Standard" -Route führte nur zu einem 404-Fehler für mich. – OcelotXL

8

Zum Beispiel tun, nehme an, dass Sie eine Aktion-Methode haben, dass der Abstand zwischen zwei Punkten berechnet:

public void Distance(int x1, int y1, int x2, int y2) 
{ 
    double xSquared = Math.Pow(x2 - x1, 2); 
    double ySquared = Math.Pow(y2 - y1, 2); 
    Response.Write(Math.Sqrt(xSquared + ySquared)); 
} 

nur die Standardroute verwenden Die Anforderung müsste folgendermaßen aussehen:

/simple/distance?x2=1&y2=2&x1=0&y1=0 

Wir können dies verbessern, indem wir eine Route definieren, mit der Sie die Parameter in einem saubereren Format angeben können.

Fügen Sie diesen Code innerhalb der RegisterRoutes Methoden innerhalb der Global.asax.cs.

routes.MapRoute("distance", 
"simple/distance/{x1},{y1}/{x2},{y2}", 
new { Controller = "Simple", action = "Distance" } 
); 

können wir jetzt nennen es /simple/distance/0,0/1,2

0

mit Ich hatte auch das gleiche Problem einmal und was ich tat, war der Anruf innerhalb der Funktion jQuery Ajax verwenden. Zuerst habe ich alle Parameterwerte mit jQuery-Selektoren ausgewählt. Unten ist meine jQuery-Funktion.

<script language="javascript" type="text/javascript"> 
$(document).ready(function() { 
    $('#btnSendNow').click(function() { 
    var grid = $('#Patient-kendo-Grid').data('kendoGrid'); 
    var location = $('#EmailTempalteLocation option:selected').text(); 
    var appoinmentType = $('#EmailTemplateAppoinmentType option:selected').text(); 
    var emailTemplateId = $('#EmailTemplateDropdown').val(); 
    var single = $('input:radio[name=rdbSingle]:checked').val(); 
    var data = grid.dataSource.view(); 
    var dataToSend = { 
    patients: data, 
    place: location, 
    appoinment: appoinmentType, 
    rdbsingle: single, 
    templateId: emailTemplateId 
    }; 
    debugger; 
    $.ajax({ 
    url: 'Controller/Action', 
    type: 'post', 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify(dataToSend) 
    }); 
    }); 
    }); 
</script> 

Meine Controller-Methode hat fünf Parameter und es ist wie folgt.

[HttpPost] 
public ActionResult SendEmailToMany(List<PatientModel> patients, string place, string appoinment, string rdbsingle, string templateId) 
{ 
emailScheduleModel = new EmailScheduleModel(); 
AmazonSentEmailResultModel result; 
List<string> _toEmailAddressList = new List<string>(); 
List<string> _ccEmailAddressList = new List<string>(); 
List<string> _bccEmailAddressList = new List<string>(); 
IEmailTemplateService emailTemplateService = new EmailTemplateService(); 
EmailTemplateContract template = emailTemplateService.GetEmailTemplateById(new  Guid(templateId)); 
emailScheduleModel.EmailTemplateContract = new EmailTemplateContract(); 
emailScheduleModel.EmailTemplateContract = template; 
} 

Es funktioniert gut in meinen Entwicklungen.

Für weitere Details folgen Sie bitte der nachstehenden URL.
http://dushanthamaduranga.blogspot.com/

Verwandte Themen