【问题标题】:how to redirect user to another page and then back, while persisting form input values如何在保持表单输入值的同时将用户重定向到另一个页面然后返回
【发布时间】:2013-12-28 23:26:22
【问题描述】:

我有一个带有各种输入字段的练习编辑表单。在用户填写练习详细信息并最终单击保存提交按钮后,此表单将发布到保存控制器操作。此表单中有一个链接(现在是 ActionLink),可将用户重定向到另一个页面以从目录中选择练习(这很有帮助,因此用户可以从带有图像的漂亮目录中选择练习,而不仅仅是下拉练习编辑表上的练习名称)。在用户从目录中选择一个练习后,他们会被重定向回练习编辑页面,我会在其中传递从目录页面中选择的练习 ID。然后将练习名称下拉菜单设置为从目录页面中选择的练习。然后,用户可以保存锻炼详情。

我遇到的问题是,在重定向到练习目录页面后,我无法找到一种保存用户输入字段值的好方法。当用户最终被重定向回练习编辑页面时,用户在重定向之前填写的练习详细信息就消失了(这是有道理的,因为我目前没有正确地保留它们。

我当前尝试持久化用户输入值的方法是使用 actionlink 将练习模型值作为匿名对象参数发送到重定向控制器操作,但是模型属性值在传递时为 null 或 0。 actionlink 似乎没有传递用户输入的输入值。

我想我可以使用 jQuery 来处理重定向的东西,所以我尝试做一个 jQuery .post,但是一旦在服务器上我不能立即重定向到另一个控制器操作,我必须进入.post 回调函数,然后将窗口 url 设置为重定向控制器操作。但是,这对于多次访问服务器来说似乎效率低下。

我觉得解决方案是在表单提交中传递这些输入值,但是我会在表单中有一个表单,我尝试过但无法工作。

@using (Html.BeginForm("Edit", "WorkoutPlanExercise",
FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <div class="editExercise">
    @Html.ValidationSummary(true)

    @Html.HiddenFor(m => Model.WorkoutPlanExerciseId)

    @Html.HiddenFor(m => Model.WorkoutPlanId)

    @Html.HiddenFor(m => Model.ImageMimeType)

    <div class="editRow">
        <div class="editExerciselbl">
            @Html.LabelFor(m => Model.Name):
        </div>
        <div class="editExerciseInput">
            @Html.DropDownListFor(
                x => x.SelectedExerciseId,
                Model.AllExercises,
                null,
                new { @id = "ddlExercise" }
            )

        </div>

        <span>
            @Html.ActionLink("Browser Exercise Catalog", "ChooseCatalogExercise", 
                new { 
                    workoutPlanExerciseId = Model.WorkoutPlanExerciseId, 
                    workoutPlanId = Model.WorkoutPlanId,
                    reps = Model.Reps,
                    sets = Model.Sets,
                    weight = Model.Weight

                })


        </span>
    </div>

    <div class="editRow">
        <div class="editExerciselbl">
            @Html.LabelFor(m => Model.Reps):
        </div>
        <div class="editExerciseInput">
            @Html.EditorFor(m => Model.Reps)
            @Html.ValidationMessageFor(m => m.Reps)
        </div>
    </div>
    <div class="editRow">
        <div class="editExerciselbl">
            @Html.LabelFor(m => Model.Weight):
        </div>
        <div class="editExerciseInput">
            @Html.EditorFor(m => Model.Weight)
            @Html.ValidationMessageFor(m => m.Weight)
        </div>
    </div>
    <div class="editRow">
        <div class="editExerciselbl">
            @Html.LabelFor(m => Model.Sets):
        </div>
        <div class="editExerciseInput">
            @Html.EditorFor(m => Model.Sets, new { @Value = "0" })
            @Html.ValidationMessageFor(m => m.Sets)
        </div>
    </div>

    <div id="exerciseImageContainer">
        @Html.Partial("Edit.ExerciseImage", Model)
    </div>


    <input id="save" type="submit" value="Save" />

    @Html.ActionLink("Cancel and return to List", "Index", new { workoutPlanId = Model.WorkoutPlanId })
</div>

}

控制器:

public ActionResult ChooseCatalogExercise(int workoutPlanExerciseId, int workoutPlanId, int reps, int sets, decimal weight)
    {

        return RedirectToAction("ChooseCatalogExercise", "ExerciseCatalog",
            new { workoutPlanExerciseId = model.WorkoutPlanExerciseId, workoutPlanId = model.WorkoutPlanId, reps = model.Reps, sets = model.Sets, weight = model.Weight });
    }

【问题讨论】:

  • 请不要将“ASP.NET MVC”简单地称为“MVC”。一种是框架,另一种是独立于语言的架构模式。这就像调用 IE - “互联网”
  • 对此感到抱歉。固定说 ASP.NET MVC。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 谢谢!今后我一定会牢记这一点 :)

标签: c# asp.net-mvc


【解决方案1】:

我能想到的一些可能性:

  • 在返回目录页面时,在呈现页面时使用服务器上的会话状态来维护和重新填充值。 (如果您必须扩展,请不要这样做)
  • 使用 cookie 保存字段的状态并在返回时重新填充它们(可能无法正常工作,因为您将达到 cookie 长度限制)
  • 不要重定向到另一个页面,而是使用 jquery ui 对话框、引导模式或其他一些弹出窗口来选择练习

我认为第三个是最好的。无论如何,它会让您的网站更具响应性。

【讨论】:

    【解决方案2】:

    “似乎 actionlink 没有传递 用户输入。”

    您需要一个表单提交才能将值传递到服务器端。因此,操作链接不会提交表单值。

    在您的场景中,我认为您可能需要更改视图结构。类似的东西,避免在两者之间导航到另一个视图。您可以使用类似于以下的 Jquery 解决方案。

    http://www.ericmmartin.com/projects/simplemodal-demos/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2013-07-18
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      相关资源
      最近更新 更多