7

RenderBody セクションを囲むフォーム タグをレイアウト ページに配置すると、目立たない検証が生成されないことに気付きました。このようなもの:

@using (Html.BeginForm())
{
    <input type="submit" value="save" />

    <div>
        @RenderBody()
    </div>
}

ご想像のとおり、コンテンツの上にボタンを生成したいと考えています。これは目立たない正しい動作ですか?

ところで、特定のページ内にフォームを配置すると、すべてが魅力的に機能します。data-val* 属性は適切に生成されます。

貴重なご協力に感謝いたします。

よろしくお願いします

ロドリゴ

4

5 に答える 5

12

ビュー内でグロテスクなハックを適用できます。

@{
    var originalContext = ViewContext.FormContext;
    ViewContext.FormContext = new FormContext();
}

<!-- This will generate proper HTML5 data-* validation attributes -->
@Html.TextBoxFor(x => x.Prop1)
@Html.ValidationMessageFor(x => x.Prop1)

@Html.TextBoxFor(x => x.Prop2)
@Html.ValidationMessageFor(x => x.Prop2)

@{
    ViewContext.FormContext = originalContext;
}
于 2011-02-14T22:17:04.337 に答える
4

コンテンツ@using (Html.BeginForm())ページに配置すると、検証の問題が修正されますが、追加の<form>タグ セットも出力に配置されます。出力に何も書き込まずに問題を修正する小さな拡張機能を作成しました。

として使用します@using (Html.BeginSubForm())

public static class FormExtensions
{
    public static MvcSubForm BeginSubForm(this HtmlHelper html)
    {
        return new MvcSubForm(html.ViewContext);
    }
}


public sealed class MvcSubForm : IDisposable
{
    private readonly ViewContext _viewContext;
    private readonly FormContext _originalFormContext;

    public MvcSubForm(ViewContext viewContext)
    {
        _viewContext = viewContext;
        _originalFormContext = viewContext.FormContext;

        viewContext.FormContext = new FormContext();
    }


    public void Dispose()
    {
        if (_viewContext != null)
        {
            _viewContext.FormContext = _originalFormContext;
        }
    }
}
于 2012-01-05T21:36:26.927 に答える
1

同じ問題に遭遇しましたが、おそらくDarin Dimitrov の回答に基づくより良い解決策です。

WebViewPage<T>秘訣は、ビューのデフォルトの基本クラスであるクラスに基づいてページの基本タイプを作成し、FormContextそこでスワップを行うことです。

abstract public class FormFixWebViewPage : FormFixWebViewPage<object>
{
}

abstract public class FormFixWebViewPage<T> : WebViewPage<T>
{
    override public void Write(System.Web.WebPages.HelperResult result)
    {
        var originalFormContext = ViewContext.FormContext;
        ViewContext.FormContext = new FormContext();

        base.Write(result);

        ViewContext.FormContext = originalFormContext;
    }
}

次に、フォルダーWeb.configの下のファイルで、次のセクションにある要素の下の属性を~/Views/変更します。pageBaseTypepagessystem.web.webPages.razor

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="<YOUR-NAMESPACE>.FormFixWebViewPage">
    <!--pages pageBaseType="System.Web.Mvc.WebViewPage"-->
        <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Helpers" />
            <add namespace="System.Web.Routing" />
        </namespaces>
    </pages>
</system.web.webPages.razor>
于 2011-05-11T08:28:17.323 に答える
1

助けてくれてありがとう、私はそれを試しましたが、あなたが提案したように(あなたが言ったように)「グロテスク」ではない解決策を見つけました:D

ページ内に BeginForm メソッドを配置し、レイアウトに BeginForm メソッドを配置するだけです。

@* On the layout page *@
@using (Html.BeginForm())
{
    <input type="submit" value="save" />

    <div>
        @RenderBody()
    </div>
}


@* On the content page *@
@using(Html.BeginForm())
{
  @* Content *@
}

したがって、最後に 2 つの BeginForm メソッドがあります。ASP.NET MVC エンジンはレイアウト ページにあるものを使用しているため、data-val* 属性が正しくレンダリングされ、フォームが必要な場所に配置されるため、送信ボタンはすべて表示されます。レイアウト上で、検証がレンダリングされた特定のページを送信できます

それはかなりうまくいきます

どうもありがとう

よろしく、 ロドリゴ

于 2011-02-15T14:17:35.497 に答える
1

子ビュー ファイルの先頭に以下のコードを追加するだけです...

@{
   Layout = "~/Views/Shared/_Layout.cshtml";
   this.ViewContext.FormContext = new FormContext();
}

私にとってはうまくいきます。

これがあなたに役立つことを願っています....

于 2012-05-24T06:37:45.553 に答える