2016-08-31 2 views
0

Я создаю страницу, на которой будет отправлена ​​строка запроса, содержащая любое число productId_{index} и productQuantity_{index}.Принять список (неизвестной длины) параметров строки запроса для действия MVC

например:

http://www.website.com/action?productId_1=65&productQuantity_1=1&productId_2=34&productQuantity_2=1 

Так что этот URL будет отображение а ProductId из 65 к quantity из 1 и а ProductId от 34 к quantity из 1.

Я не могу изменить, как это отправляется на страницу, и почему я не использовал a solution like this.

Я хотел бы как-то сопоставить запрос в этом формате с строго типизированным списком объектов.

Этот вопрос предназначен в основном для того, чтобы спросить о способе MVC для этого, поскольку у меня уже есть решение с использованием объекта Request, но, чтобы сделать это, предпочтительным был бы способ MVC.

+0

Приведите пример URL-адреса –

+0

@StephenMuecke Сделано, не уверен в его форматировании. – Djorge

+2

Используйте специальную вставку для модели: http://stackoverflow.com/questions/32373662/custom-model-binder-for-asp-net-mvc-on-get-request –

ответ

0

Как мне было предложено, я использовал custom model binder, чтобы дать мне список объектов в моем действии.

Пользовательские модели Binder

public class ProductIdAndQuantityListModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var request = controllerContext.HttpContext.Request; 

     var products = new List<ProductIdAndQuantity>(); 

     for (int i = 0; i < 25; i++) 
     { 
      string productIdKey = string.Format("productid_{0}", i); 
      string quantityKey = string.Format("productqty_{0}", i); 

      string productIdVal = request[productIdKey]; 
      string quantityVal = request[quantityKey]; 

      if (productIdVal == null || quantityVal == null) 
       break; 

      int productId = Convert.ToInt32(productIdVal); 
      int quantity = Convert.ToInt32(quantityVal); 

      var productIdAndQuantity = products.FirstOrDefault(x => productId == x.ProductId); 

      if (productIdAndQuantity != null) 
      { 
       productIdAndQuantity.Quantity += quantity; 
      } 
      else 
      { 
       products.Add(new ProductIdAndQuantity() 
       { 
        ProductId = productId, 
        Quantity = quantity 
       }); 
      } 
     } 

     return products; 
    } 
} 

Global.asax.cs

protected void Application_Start() 
{ 
    ModelBinders.Binders.Add(typeof(ICollection<Models.Basket.ProductIdAndQuantity>), new ProductIdAndQuantityListModelBinder()); 
} 

Действие

public ActionResult Index(ICollection<ProductIdAndQuantity> products) 
{ 
    foreach (var product in products) 
    { 
     // Do stuff... 
    } 
} 

Спасибо всем за вашу помощь! Как вы можете видеть, это неизвестное, но не неограниченное количество параметров, которые могут возникнуть, и я думаю, что это просто до того, как я его использую.

+0

Поскольку я в основном закончил с тем, что ответ на связанный вопрос был, я не уверен, что этот вопрос будет полезен кому-либо еще. – Djorge

0

вам нужно отформатировать строку запроса к чему-то более простым и легким для чтения, как это: р = Ид количество, то вы можете использовать Params,

например: http://www.website.com/action?p=65-1&p34-4&p=32-23&p= ....

public ActionResult Products(params string[] p) 
{ 
    foreach(var product in p) 
    { 
     var productId = product.Split('-')[0]; 
     var quantity = product.Split('-')[1]; 
    } 
} 

[Уведомление] Я не рекомендую отправлять такие параметры через URL-адрес «GET», это лучше и безопаснее, если вы используете метод формы «POST».

+0

OP заявил, что я не могу изменить способ его отправки на страницу_ и если бы это можно было изменить, это, конечно, не способ сделать это –

+0

жаль, что я пропустил этот момент! – Ziyad

Смежные вопросы