Лучший способ передать несколько параметров из View в Controller через JQuery - PullRequest
1 голос
/ 31 августа 2009

У меня есть представление для создания клиента, которое содержит множество текстовых полей. После того, как пользователь выберет вкладки из каждого текстового поля, я хочу использовать JQuery для вызова метода Controller, который будет проверять базу данных и искать возможные совпадения, затем контроллер будет отправлять содержимое, а я буду использовать jQuery для динамического отображения возможных совпадений (Похожие что делает переполнение стека, когда вы вводите свой вопрос и показывает связанные вопросы).

У меня вопрос: у меня есть 15 текстовых полей, и я хотел бы отправлять эти данные с каждого ответного звонка при каждом вызове. Я хотел бы избежать использования моего метода Controller с подписью типа

Public ActionResult CheckMatches(string param1, string param2... string param15)

Есть ли более простой способ передать несколько параметров в один объект, например FormCollection?

Ответы [ 2 ]

3 голосов
/ 31 августа 2009

Все, что вам нужно сделать, это создать тип со свойствами, имя которых совпадает с именами ваших текстовых полей:

public class CheckMatchesAguments
{
    public string Param1 { get; set; }
    public string Param2 { get; set; }
    // etc.
}

Затем измените свое действие на:

public ActionResult CheckMatches(CheckMatchesAguments arguments)

Вот и все!

Будьте осторожны: если CheckMatchesAguments имеет какие-либо необнуляемые свойства (например, ints), тогда значения для этих свойств должны быть в FormCollection, иначе механизм связывания по умолчанию не будет связывать что-либо тип. Чтобы это исправить, либо включите эти свойства в форму, либо сделайте свойства обнуляемыми.

0 голосов
/ 31 августа 2009

Javascript:

 var data = { foo: "fizz", bar: "buzz" };
 $.get("urlOfAction", data, callback, "html")

Действие:

 public ActionResult FooAction(MegaParameterWithLotOfStuff param)

И пользовательская модель переплета :

public class MegaParameterWithLotOfStuffBinder : IModelBinder
{
    public object GetValue(ControllerContext controllerContext,
        string modelName, Type modelType,
        ModelStateDictionary modelState)
    {
        var param = new MegaParameterWithLotOfStuff();

        param.Foo = controllerContext.
            HttpContext.Request.Form["foo"];
        param.Bar = controllerContext.
            HttpContext.Request.Form["bar"];

        return customer;
    }
}

Global.asax:

protected void Application_Start()
{
    ModelBinders.Binders[typeof(MegaParameterWithLotOfStuff)] =
        new MegaParameterWithLotOfStuffBinder();
}

Или фильтр привязки + комбинация действий:

 public class BindMegaParamAttribute: ActionFilterAttribute
    {
        public override void OnActionExecuting
             (ActionExecutingContext filterContext)
        {
            var httpContext = filterContext.HttpContext;

            var param = new MegaParameterWithLotOfStuff();

            param.Foo = httpContext.Request.Form["foo"];
            param.Bar = httpContext.Request.Form["bar"];

            filterContext.ActionParameters["param"] = param;
            base.OnActionExecuted(filterContext);
        }
    }

Действие:

[BindMegaParam]
public ActionResult FooAction(MegaParameterWithLotOfStuff param)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...