Передача нескольких параметров в контроллер? - PullRequest
4 голосов
/ 14 июля 2009

ки. простой, обволакивающий мой мозг

У меня есть метод, который у меня есть в контроллере

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

Как получить несколько параметров из URL-адреса контроллера?

Я не хочу использовать QueryString, так как он, кажется, не относится к mvc.

Есть ли маршрут? Или другой механизм, чтобы заставить эту работу? Или я что-то упустил здесь с MVC

EDIT

URL, который я пытаюсь найти, это

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

так что, если это был классический жерех

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

Но я чувствую, что я что-то упустил, понял что-то, что в спешке, чтобы добраться до рабочего кода, я упустил момент, что действительно должен быть в запросе пут - и я должен собрать это из коллекции форм.

Хотя, возможно, стоит посмотреть, можно ли это сделать - для дальнейшего использования =>

Ответы [ 5 ]

9 голосов
/ 25 марта 2011

Например, предположим, что у вас есть метод действия, который вычисляет расстояние между двумя точками:

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));
}

Используя только маршрут по умолчанию, запрос должен выглядеть следующим образом:

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

Мы можем улучшить это, определив маршрут, который позволяет указывать параметры в более чистом формате.

Добавьте этот код внутри RegisterRoutes методов в Global.asax.cs.

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

Теперь мы можем назвать его, используя /simple/distance/0,0/1,2

2 голосов
/ 14 июля 2009

Как то так?:

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

или

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

ОБНОВЛЕНИЕ:

Этот маршрут должен быть размещен перед маршрутом по умолчанию:

// 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 голосов
/ 12 июня 2013

Однажды у меня тоже была такая же проблема, и я использовал вызов Ajax внутри функции jQuery. Сначала я выбрал все значения параметров с помощью селекторов jQuery. Ниже моя функция jQuery.

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

Мой метод контроллера имеет пять параметров, как показано ниже.

[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;
}

Он отлично работает в моих разработках.

Для получения более подробной информации, пожалуйста, следуйте нижеприведенному адресу.
http://dushanthamaduranga.blogspot.com/

0 голосов
/ 14 июля 2009

Используйте скрытые значения в вашей форме

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

и связыватель модели выполнит связывание

public ActionResult Details(string strFirstName, string strLastName)
{
      return View(repository.getListByFirstNameSurname(strFirstName, strLastName)
}
0 голосов
/ 14 июля 2009

Также возможно использовать FormCollection:

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

Аналогичным образом, если HTTP-запрос содержит значение формы с точно таким же именем (с учетом регистра), он автоматически будет передан в метод ActionResult.

Кроме того, просто чтобы прояснить, в параметрах строки запроса ничего нет MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...