保留MVC表单回发的路由详细信息

时间:2012-05-01 19:44:06

标签: c# asp.net-mvc razor

我有一个基本的MVC表单,可以通过 GET 操作访问,并从路径中提取3个字符串参数。

[HttpGet]
public ActionResult Application(string x, string y, string z)
{
    //create model, setup form, etc...

    return View(model);
}

访问此表单的路由配置如下:

routes.MapRoute("Application", 
    "application/{x}/{y}/{z}",
    new
    {
        controller = "Application",
        action = "Application",
        x = "",
        y = "",
        z = ""
    }); 

表单配置如下:

Html.BeginForm("Application", "Application", FormMethod.Post)

所有这一切都有效,直到我在结果表单上单击提交。从路由角度来看,调用正确的POST操作并正确绑定模型。问题是我丢失了仍然需要的所有 x / y / z 路由信息。 如何保留路线信息?

我尝试了几件事:

  • 向隐藏字段中的表单添加了路由详细信息,这些字段已正确添加到表单内容中,但永远不会在回发模型中返回
  • 尝试使用 Html.BeginForm RouteValueDictionary 重载,但无法弄清楚如何使其工作。我可能只需要一个如何使用它以及如何从Controller访问状态的正确示例

更新:这会添加查看示例,以帮助解决有关使用隐藏字段的评论

@using (Html.BeginForm("Application", "Application", FormMethod.Post, new
                                                                        {
                                                                            autocomplete = "on", 
                                                                            id = "LoanApplication", 
                                                                            novalidate = string.Empty, 
                                                                            name = "Application"
                                                                        }))
{
    <fieldset>
        @Html.HiddenFor(m => m.x)
        @Html.HiddenFor(m => m.y)
        @Html.HiddenFor(m => m.z)
        @Html.HiddenFor(m => m.DigiCertId)
        <br />
        <input id="SubmitButton" type="submit" value="@Resources.SubmitApplicationButton" title="@Resources.SubmitApplicationButtonDescription" />
    </fieldset>
}

2 个答案:

答案 0 :(得分:1)

您应该将这些属性放在模型中,然后为每个属性设置HiddenFor,如下所示:

@Html.HiddenFor(m => m.x)
@Html.HiddenFor(m => m.y)
@Html.HiddenFor(m => m.z)

然后在你的post方法中(假设它是这样的),你可以在RouteValueDictionary中将它们传递给Get方法,如下所示:

[HttpPost]
public ActionResult Application(MyModel model) //whatever type your model is
{
    //do whatever your post method does before redirect
    return RedirectToAction("Application", new { x = model.x, y = model.y, z = model.z});
}

答案 1 :(得分:0)

除了mattytommo建议的ans。我建议在asp.net MVC中使用TempData集合。这会使用会话存储保存数据,但会临时执行,并且一旦访问它就会删除数据 这是出于这些目的而特别存在的 所以你可以将数据保存在TempData中TempData["Values"] = new {X=x,Y=y,Z=z}; 然后在帖子后访问TempData["Values"]