Значения маршрутов исчезают в View .Net MVC3 - PullRequest
0 голосов
/ 11 августа 2011

У меня простой контроллер:

public class TestController : Controller
    {
        public ActionResult Test(string r)
        {
            return View();
        }

    }

У меня есть простой View Test.cshtml:

<h2>@ViewContext.RouteData.Values["r"]</h2>
        @using (Html.BeginForm("Test", "Test"))
        {
            <input type="text" name="r" />
            <button>Submit</button>
        }

У меня есть правило маршрута в Global.asax:

routes.MapRoute(
            null,
            "Test/{r}",
            new { action = "Test", controller = "Test",
                r = UrlParameter.Optional }
        );

Я хочу сделать такую ​​вещь: пользователь вводит значение маршрута во ввод, нажимает submit и контроллер перенаправляет его на страницу Test / value. Но контроллер показывает просто страницу с именем Test каждый раз. ViewContext.RouteData.Values ​​["r"] тоже пусто. Я проверяю в отладке, Тестовое действие корректно получает пользовательское значение r. Как я могу реализовать свою идею? Благодаря.

Ответы [ 3 ]

1 голос
/ 17 октября 2011

Я супер опоздал на вечеринку, но просто хотел выложить решение для справки.Давайте предположим, что эта форма имеет больше, чем просто сильную, поскольку это вход.Предполагая, что есть другие входные данные, мы можем заключить входные данные формы в класс в нашей модели, который называется TestModel, свойства которого отображаются на идентификаторы входных данных формы.

В нашем посте мы перенаправляем на get, передавая значения маршрута, которые нам нужны в URL.Любые другие данные затем могут быть переданы для получения с использованием TempData.

public class TestController : Controller
    {
        [HttpGet]
        public ActionResult Test(string r) 
        {
            TestModel model = TempData["TestModel"] as TestModel;
            return View(model);
        }

        [HttpPost]
        public ActionResult Test(string r,TestModel model) //some strongly typed class to contain form inputs
        {
            TempData["TestModel"] = model; //pass any other form inputs to the other action
            return RedirectToAction("Test", new{r = r}); //preserve route value
        }

    }
0 голосов
/ 11 августа 2011

Насколько вы говорите, чтобы отправить форму на Html.BeginForm("Test", "Test"), вы всегда будете отправлены обратно на ту же страницу.

Решением может быть использование явного Redirect для действия с использованием 'RedirectToAction' (в представлении), или вы можете использовать javascript для изменения действия формы:

<input type="text" name="r" onchange="this.parent.action = '\/Test\/'+this.value"/>
0 голосов
/ 11 августа 2011

Вы не можете сделать это без JavaScript.Существует два типа методов, которые существуют при отправке <form>: GET и POST.Когда вы используете POST (который используется по умолчанию), форма помещается в URL-адрес, но все данные, введенные в поля ввода, являются частью тела POST, поэтому они не являются частью URL-адреса.Когда вы используете GET, данные полей ввода являются частью строки запроса, но имеют вид /Test?r=somevalue.

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

$('form').submit(function() {
    var data = $('input[name="r"]', this).val();
    window.location.href = this.action + '/' + encodeURIComponent(data);
    return false;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...