ASP.NET MVC URl Routing: как бороться? Action = Тестовый параметр - PullRequest
1 голос
/ 23 января 2010

Мне необходимо реализовать простое веб-приложение для онлайн-соревнования по простой игре. Мне нужно обработать запрос Get и ответить на него.

Я подумал, что давайте просто воспользуемся приложением ASP.Net MVC, и пусть оно обрабатывает URL.

Проблема в том, что URL, который мне нужно обработать, это:

 http://myDomain.com/bot/?Action=DoThis&Foo=Bar

Я пытался:

public ActionResult Index(string Action, string Foo)
    {
        if (Action == "DoThis")
        {
            return Content("Done");
        }
        else
        {
            return Content(Action);
        }
    }

Проблема в том, что строка Action всегда устанавливается как имя действия маршрута. Я всегда получаю:

Action == "Index"

Похоже, ASP.Net MVC переопределяет ввод параметра Action и использует фактическое действие ASP.Net MVC.

Поскольку я не могу изменить формат URL, который мне нужно обработать: есть ли способ получить параметр правильно?

Ответы [ 4 ]

5 голосов
/ 23 января 2010

Возьмите действие из QueryString, старой школы:

 string Action = Request.QueryString["Action"];

Тогда вы можете запустить оператор case / if на нем

public ActionResult Index(string Foo)
{
    string Action = Request.QueryString["Action"];
    if (Action == "DoThis")
    {
        return Content("Done");
    }
    else
    {
        return Content(Action);
    }
}

Это одна дополнительная строка, но это очень простое решение с небольшими накладными расходами.

0 голосов
/ 23 января 2010

Как насчет использования старого доброго ASP.Net? ASP.NET MVC не помогает в вашей ситуации. Это на самом деле на вашем пути.

0 голосов
/ 23 января 2010

Я тоже видел ТАК вопрос . Это может сработать для действий, которые я не знаю.

0 голосов
/ 23 января 2010

Возможно, напишите HttpModule, который переименует параметр actionstring действия. HttpModules запускаются до того, как MVC получает запрос.

Вот быстрый и уродливый пример. Ужасно, потому что мне не нравится, как я заменяю имя параметра, но вы поняли.

public class SeoModule : IHttpModule
{
    public void Dispose()
    { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += OnBeginRequest;
    }

    private void OnBeginRequest(object source, EventArgs e)
    {
        var application = (HttpApplication)source;
        HttpContext context = application.Context;

        if (context.Request.Url.Query.ToLower().Contains("action=")) {
            context.RewritePath(context.Request.Url.ToString().Replace("action=", "actionx="));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...