路径值在View .Net MVC 3中消失

时间:2011-08-11 09:49:18

标签: asp.net-mvc-3 routes

我有简单的控制器:

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 }
        );

我想做这样的事情:用户在输入中键入路由值,按提交,控制器将他重定向到页面测试/值。但控制器每次只显示名称为Test的页面。 ViewContext.RouteData.Values [“r”]也是空的。我检查调试,测试操作正确地收到r的用户值。 我怎样才能实现自己的想法? 感谢。

3 个答案:

答案 0 :(得分:1)

我参加派对已经很晚了,但只是想发布一个解决方案供参考。让我们假设这种形式不仅仅是一个强大的输入。假设还有其他输入,我们可以将表单的输入结合到我们模型中的一个类中,称为TestModel,其属性映射到表单输入的id。

在我们的帖子中,我们重定向到get,传入URL中我们需要的路由值。然后可以使用TempData将任何其他数据传递到get。

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
        }

    }

答案 1 :(得分:0)

如果没有javascript,你就无法做到这一点。提交<form>时存在两种类型的方法:GET和POST。当您使用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;
});

答案 2 :(得分:0)

就您要将表单发布到Html.BeginForm("Test", "Test")而言,您将始终发布回同一页面。

解决方案可能是使用“RedirectToAction”(在视图中)使用显式重定向到操作,或者您可以使用javascript来更改表单的操作:

<input type="text" name="r" onchange="this.parent.action = '\/Test\/'+this.value"/>