Я новичок в MVC и в моем контроллере есть следующий ActionMethod:
public async Task<ActionResult> ViewSsoProviders(int? page, string nameFilter = "", string bpIdFilter = "",
string protocolFilter = "")
Я пытаюсь вызвать это через следующую форму, на мой взгляд:
@{
using (Html.BeginForm("ViewSsoProviders", "SsoAdmin", new
{
page = 1,
nameFilter = Model.ProviderNameFilter,
bpIdfilter = Model.BusinessPartnerIdFilter,
protocolFilter = Model.ProtocolFilterSelection
}))
{
<div id = "providerForm">
@Html.ValidationSummary()
<div class = "form-group row">
<span class = "col-sm-4">
@Html.LabelFor(m => m.ProviderNameFilter)
@Html.TextBoxFor(m => m.ProviderNameFilter, new {@class = "form-control"})
</span>
<span class = "col-sm-4">
@Html.LabelFor(m => m.BusinessPartnerIdFilter)
@Html.TextBoxFor(m => m.BusinessPartnerIdFilter, new {@class = "form-control", style = "display: block"})
</span>
<span class = "col-sm-4">
@Html.LabelFor(m => m.ProtocolFilterOptions)
@Html.TranslatedDropDownListFor(m => m.ProtocolFilterSelection, Model.ProtocolFilterOptions, new {id = "ddlProtocols", @class = "form-control"})
</span>
</div>
<button class = "btn" type = "submit" value = "Filter">@Html.Translate("Filter")</button>
</div>
Метод работает, однако фильтрам не были присвоены значения, я могу жестко закодировать переменную «страница», и она достигнет моего контроллера с правильным значением, поэтому проблема не в самой маршрутизации. Есть ли здесь какая-либо очевидная причина, по которой моим переменным маршрута не могут быть присвоены значения?
Обновлено: стоит отметить, что если я вместо этого передам «null», а не какие-либо значения маршрута в представлении, я могу передать модель контроллеру только с полями в назначенных данных формы.
@Kadir Я оценил RouteData в контроллере, когда форма попадает в него, и страница не появляется в списке значений, равно как и любые другие мои ожидаемые переменные.
Почему бы вам просто не удалить все фильтры, которые вы добавили в метод, и просто передать ему модель представления?
@JamesS спасибо за предложение, но у меня есть пейджинг в таблице результатов, который не переносит фильтры, если вы переходите на следующую страницу, я знаю, что пейджинг работает, если я могу передавать фильтры таким образом. Возможно, мне придется переосмыслить архитектуру, но несколько раз я чувствовал себя очень близко к правильному ответу. MVC бесконечно полезен, но может быть очень разочаровывающим.
Вы отправляете форму, которая должна быть постом. У вас должен быть новый метод и украсить его:
[HttpPost]
и параметризуйте его с помощью другой модели или модели представления, которая содержит свойства, которые вам нужно получить.
Бывший.
[HttpPost]
public ActionResult ViewSsoProviders(MyViewModel model)
{
//Do a redirection to ViewSoProviders
//ex.
return RedirectToAction("ViewSsoProviders", new {nameFilter = model.NameFiler, bpIdFilter = model.BpIdFilter, protocolFilter= model.ProtocolFilter });
}
И укажите метод формы в представлении бритвы:
Html.BeginForm("ViewSsoProviders", "SsoAdmin", FormMethod.Post, new
{
page = 1,
nameFilter = Model.ProviderNameFilter,
bpIdfilter = Model.BusinessPartnerIdFilter,
protocolFilter = Model.ProtocolFilterSelection
}))
@Luke_Villanueva Это то, что я хотел, большое спасибо!
Какой результат вы получаете от RouteData.Values["page"]?