ASP.NET MVC 3: Generieren Sie eine unauffällige Validierung, wenn sich BeginForm im Layout befindet

Translate

Ich habe gerade festgestellt, dass beim Platzieren eines Formular-Tags auf meiner Layout-Seite, die den RenderBody-Abschnitt umgibt, keine unauffällige Validierung generiert wird. Etwas wie das:

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

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

Wie Sie vielleicht vermutet haben, möchte ich Schaltflächen über meinen Inhalten generieren. Ist das das richtige unauffällige Verhalten?

Übrigens, wenn ich das Formular auf einer bestimmten Seite platziere, funktioniert alles wie ein Zauber: Die data-val * -Attribute sind gut generiert.

Ich werde Ihre wertvolle Hilfe schätzen.

freundliche Grüße

Rodrigo

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Sie könnten einen grotesken Hack in Ihrer Ansicht anwenden:

@{
    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;
}
Quelle
Translate

Beim Putten@using (Html.BeginForm())In der Inhaltsseite wird das Validierungsproblem behoben, durch das auch ein zusätzlicher Satz hinzugefügt wird<form>Tags in die Ausgabe. Ich habe eine kleine Erweiterung erstellt, die das Problem behebt, ohne etwas in die Ausgabe zu schreiben.

Verwenden Sie es als@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;
        }
    }
}
Quelle
Translate

Vielen Dank für Ihre Hilfe, ich habe es versucht, aber ich habe eine Lösung gefunden, die nicht so "grotesk" ist (wie Sie sagten), wie Sie vorgeschlagen haben: D.

Ich habe einfach eine BeginForm-Methode in meine Seite eingefügt und auch eine BeginForm-Methode in das Layout eingefügt:

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

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


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

Am Ende habe ich also zwei BeginForm-Methoden: Die ASP.NET MVC-Engine verwendet die auf der Layoutseite, sodass die data-val * -Attribute korrekt gerendert werden und das Formular genau dort platziert wird, wo ich es wollte, also eine Schaltfläche zum Senden auf dem Layout kann meine bestimmte Seite mit den gerenderten Validierungen einreichen

Es funktioniert ziemlich gut

Vielen Dank

Grüße,Rodrigo

Quelle
Translate

Ich bin gerade auf das gleiche Problem gestoßen, aber möglicherweise auf eine bessere Lösung basierend aufDarin DimitrovsAntworten.

Der Trick besteht darin, einen Seitenbasistyp basierend auf dem zu erstellenWebViewPage<T>Klasse, die Standardbasisklasse für Ansichten und führen Sie die ausFormContextdort tauschen.

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

Und dann in derWeb.configDatei unter der~/Views/Ordner, ändern Sie diepageBaseTypeAttribut unterpagesElement, das in der gefunden werden kannsystem.web.webPages.razorSektion:

<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>
Quelle
Translate

Fügen Sie einfach den folgenden Code oben in der untergeordneten Ansichtsdatei hinzu ...

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

Es funktioniert gut für mich.

ich hoffe, dies wird dir helfen....

Quelle
Über den Autor