查看
@using (Html.BeginForm())
{
...form elements
@Html.Action("PartialView")
}
PartialView
if (something) {
<input type="submit" value="Submit" />
} else {
@using (Html.BeginForm())
{
<input type="submit" value="Submit" />
}
有人可以提出解决上述问题的方法吗?
如果PartialView if语句返回false,我最终会使用嵌套表单。我可以在局部视图中移动窗体关闭括号,以避免嵌套窗体和页面呈现正确但这会扰乱visual studio,因为它希望在视图中看到近括号。那有关系吗?
编辑:
根据Chris的评论,以下修改是一种更好的方法吗?即一个表单有两个提交按钮,在同一个操作方法中调用不同的代码?
PartialView
if (something) {
<input type="submit" name="btn" value="Submit1" />
} else {
<input type="submit" name="btn" value="Submit2" />
}
控制器
[HttpPost]
public ActionResult Index()
{
if (btn == "Submit1") {
...do a thing
} else {
...do another thing
};
}
答案 0 :(得分:0)
答案 1 :(得分:0)
我遇到了同样的问题,并想出了一个真正解决它的助手。
/**
* Ensure consequent calls to Html.BeginForm are ignored. This is particularly useful
* on reusable nested components where both a parent and a child begin a form.
* When nested, the child form shouldn't be printed.
*/
public static class SingleFormExtensions
{
public static IDisposable BeginSingleForm(this HtmlHelper html)
{
return new SingleForm(html);
}
public class SingleForm: IDisposable
{
// The form, if it was needed
private MvcForm _form;
public SingleForm(HtmlHelper html)
{
// single per http request
if (!HttpContext.Current.Items.Contains(typeof(SingleForm).FullName))
{
_form = html.BeginForm();
HttpContext.Current.Items[typeof(SingleForm).FullName] = true; // we need the key added, value is a dummy
}
}
public void Dispose()
{
// close the form if it was opened
if (_form != null)
{
_form.EndForm();
HttpContext.Current.Items.Remove(typeof(SingleForm).FullName);
}
}
}
}
要使用它,请包含扩展程序的命名空间,并在任何位置执行@Html.BeginSingleForm(
。不仅在嵌套视图中,而且在父视图中。
兴趣点:需要保存表单是否已提前打开。我们不能有每个线程变量ThreadStatic的静态或静态,因为许多Asp.Net线程可能会使用它。添加变量的唯一单线程和每个http请求位置是HttpContext.Current.Items
字典。
提交按钮的数量没有限制。问题是嵌套的form
元素。要避免使用多个提交按钮,您可以使用jquery隐藏它们,或者扩展此帮助程序以在结尾处自动添加提交按钮。