我想知道如何在asp.net mvc 3 RC中提交表单时执行多个表单操作.
如果我正在编辑一个用户,例如我想要一个带有以下按钮的动作栏;
“保存”| “保存并关闭”| “取消”
保存 – 提交表单并保存,返回到编辑屏幕.可以轻松实现为标准输入/提交按钮.这里没什么特别的
控制器代码可能看起来像
public ActionResult Edit(Userviewmodel model) { ... return RedirectToAction("Edit",model.Id"); }
取消 – 只返回上一屏幕.我正在考虑使用锚标签.
<a href="@Request.UrlReferrer" class="button">Cancel</a>
但是,当您需要提交相同的表单数据时,我对如何实施“保存并关闭”感到困惑.我想知道有可能有一个可空的近距离参数吗?
public ActionResult Edit(Userviewmodel model,bool? close) { ... return close.GetValueOrDefault(false) ? RedirectToAction("Index",model.Id" : RedirectToAction("Edit",model.Id"); }
但是,如何在这种情况下提交这个额外的参数以及表单?
如果可能的话,我想要像上面的模型一样使用一个单一的表单操作来处理提交.
我也有兴趣,如果其他人提出了一个很好的用户互动模型围绕这个想法.
解
我最后使用Omar的建议,但不是传入一个字符串,我拿到一个枚举,所以我不必在所有的控制器中进行字符串检查.
public ActionResult Edit(Userviewmodel model,FormAction actionType) { // pre-check if (actionType == FormAction.Cancel) // just return user to prevIoUs view and don't save. // Save code if (actionType == FormAction.Save) return ... else if (actionType == FormAction.SaveAndClose) .... }
因为我希望< input>上的一个更友好的“保存并关闭”文本.按钮,但是想使用枚举我实现了一个自定义的ModelBinder for FormAction来进行解析.
解决方法
您可以在具有相同名称属性但具有不同值属性的表单中具有多个提交按钮.单击哪个按钮,相关联的值将被发布到服务器.
您可以使用一个简单的链接取消,但我会把它作为一个按钮.
<input type="submit" name="actionType" value="Save" /> <input type="submit" name="actionType" value="Save and Close" /> <input type="submit" name="actionType" value="Cancel" />
在你的行动中,测试价值观.
public ActionResult Edit(string actionType) { if(actionType == "Save") { // Save action } else if (actionType == "Save and Close") { // Save and quit action } else { // Cancel action } }
如果您不喜欢在value属性中使用长文本,则可以使用标准HTML< button>标签,可让您定义单独的值和单独的文本.