如何将用户重定向到另一个页面,然后返回,同时保持表单输入值

时间:2013-12-28 23:26:22

标签: c# asp.net-mvc

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

我遇到的问题是,在重定向到练习目录页面后,我无法想出一个保持用户输入字段值的好方法。当用户最终被重定向回锻炼编辑页面时,用户在重定向之前填写的锻炼细节消失了(这是有道理的,因为我目前没有正确地持久化它们。

我当前尝试保留用户输入值的方法是使用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 });
    }

2 个答案:

答案 0 :(得分:1)

我能想到的一些可能性:

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

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

答案 1 :(得分:1)

  

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

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

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

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