ASP.NET MVC - фильтр, какое действие вызывать на основе строки запроса - PullRequest
3 голосов
/ 28 июля 2010

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

Например, у меня есть сетка со столбцом переключателя, чтобы выбрать элемент в сетке. Сетка обернута в форму, а вверху сетки находятся кнопки для редактирования / удаления выбранного элемента. Нажатие на кнопки редактирования / удаления сообщений назад и отключение магии jquery для задания свойства команды, чтобы я мог различать редактирование и публикацию. Затем я могу справиться с этим, добавив атрибут фильтра HttpPost к своему действию.

Теперь мне нужно добавить поиск в форму. Самый простой способ сделать это - разместить форму поиска вне существующей формы и установить метод get. Это работает, но у меня есть случай, когда форма поиска должна быть расположена в моей форме сетки. Я понимаю, что у меня не может быть вложенных форм, поэтому я удалил теги формы для внутренней формы, но теперь при выполнении поиска будет запускаться запрос на публикацию. Если вы все еще продолжаете следовать, вы увидите, что это вызывает метод действия редактирования / удаления, но я действительно хочу инициировать начальное действие, но иметь дополнительный параметр поиска.

Вот как выглядят мои методы действий:

public ActionResult Index(string search)
{
    return GetData(search);
}

[HttpPost]
public ActionResult Index(string command, int id)
{
    switch (command)
    {
        case "Delete":
            DeleteData(id);
            break;
        case "Edit":
            return RedirectToAction("Edit", new { id = id });
    }

    return RedirectToAction("Index");
}

В идеале я бы хотел сказать:

public ActionResult Index(string search)
{
    return GetData(search);
}

[HttpPost]
[Command(Name="Delete,Edit")] OR [Command(NameIsNot="Search")]
public ActionResult Index(string command, int id)
{
    switch (command)
    {
        case "Delete":
            DeleteData(id);
            break;
        case "Edit":
            return RedirectToAction("Edit", new { id = id });
    }

    return RedirectToAction("Index");
}

Обратите внимание, как я фильтрую, какое действие вызывается на основе команды. Может быть, я в полной неразберихе, но MVC для меня новичок, и я был бы очень признателен, если бы кто-то мог помочь.

Спасибо

1 Ответ

0 голосов
/ 28 июля 2010

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

public class CommandConstraint : IRouteConstraint
{
    #region Fields
    private string[] Matches;
    #endregion

    #region Constructor
    /// <summary>
    /// Initialises a new instance of <see cref="CommandConstraint" />
    /// </summary>
    /// <param name="matches">The array of commands to match.</param>
    public CommandConstraint(params string[] matches)
    {
        Matches = matches;
    }
    #endregion

    #region Methods
    /// <summary>
    /// Determines if this constraint is matched.
    /// </summary>
    /// <param name="context">The current context.</param>
    /// <param name="route">The route to test.</param>
    /// <param name="name">The name of the parameter.</param>
    /// <param name="values">The route values.</param>
    /// <param name="direction">The route direction.</param>
    /// <returns>True if this constraint is matched, otherwise false.</returns>
    public bool Match(HttpContextBase context, Route route, 
        string name, RouteValueDictionary values, RouteDirection direction)
    {
        if (Matches == null)
            return false;

        string value = values[name].ToString();
        foreach (string match in Matches)
        {
            if (string.Equals(match, value, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }

        return false;
    }
    #endregion
}

И затем запрограммировать мои маршруты следующим образом:

routes.MapRoute("Search", "Home/{command}",
                new
                {
                    controller = "Home",
                    action = "Index",
                    command = UrlParameter.Optional
                },
                new { command = new CommandConstraint("Search") });

routes.MapRoute("Others", "Home/{command}/{id}",
                new
                {
                    controller = "Home",
                    action = "Index",
                    command = UrlParameter.Optional,
                    id = UrlParameter.Optional
                },
                new { command = new CommandConstraint("Delete", "Edit") });

Очевидно, вам нужно изменить свои действия с индексом (...)так что имена параметров оба являются «командами», но это должно хотя бы помочь вам в правильном направлении?

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