我有简单的控制器:
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的用户值。 我怎样才能实现自己的想法? 感谢。
答案 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"/>