我有一个带有各种输入字段的练习编辑表单。在用户填写练习详细信息并最终单击“保存”提交按钮后,此表单将发布到“保存”控制器操作。在这个表单中是一个链接(现在是一个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 });
}
答案 0 :(得分:1)
我能想到的一些可能性:
我认为第三是最好的。无论如何,它使您的网站更具响应性。
答案 1 :(得分:1)
“似乎actionlink没有传递输入值 用户输入。“
您需要提交表单才能将值传递给服务器端。因此,操作链接不会提交表单值。
在您的方案中,我认为您可能需要更改视图结构。有点像,避免导航到中间的另一个视图。您可以使用类似于以下的Jquery解决方案。