1

看法

@using (Html.BeginForm())
{
    ...form elements
    @Html.Action("PartialView")
}

部分视图

if (something) {
    <input type="submit" value="Submit" />
} else {
    @using (Html.BeginForm())
    {
        <input type="submit" value="Submit" />
    }

有人可以提出解决上述问题的方法吗?

如果 PartialView if 语句返回 false,我将得到嵌套表单。我可以在局部视图中移动表单右括号以避免嵌套表单并且页面正确呈现,但这会使 Visual Studio 感到不安,因为它希望在视图中看到右括号。这有关系吗?

编辑:

根据克里斯的评论,以下修改是更好的方法吗?即一个带有两个提交按钮的表单,它们在同一个操作方法中调用不同的代码?

部分视图

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
    };
}
4

2 回答 2

0

<form>另一个标签内的标签<form>不是有效的 HTML

参考W3c Spec

可用的解决方法

http://blog.avirtualhome.com/how-to-create-nested-forms/

于 2013-10-21T14:53:57.900 回答
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 隐藏它们,或者扩展此帮助程序以在末尾自动添加提交按钮。

于 2014-10-09T15:51:51.750 回答