0

我有一个基本的 MVC 表单,可以通过GET Action 访问,其中包含从路由中提取的 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 Action 被调用并且模型被正确绑定。问题是我丢失了我仍然需要的所有x/y/z路线信息。如何保存路线信息?

我尝试了几件事:

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

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

@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>
}
4

2 回答 2

1

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

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

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

[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});
}
于 2012-05-01T19:52:04.737 回答
0

除了mattytommo建议的ans。我建议TempData在 asp.net MVC 中使用集合。这会使用会话存储来保存数据,但会临时保存数据,一旦您访问它,数据就会被删除。
这是专门为这些目的而存在的,
因此您可以将数据保存在 TempData 中,TempData["Values"] = new {X=x,Y=y,Z=z}; 然后TempData["Values"]在发布后访问

于 2012-05-01T19:57:12.960 回答