42 Stimmen

Abrufen der aktuellen Ansicht Name in ASP.NET MVC?

Ich habe eine partielle Ansicht (Steuerung), die über mehrere Ansichtsseiten verwendet wird, und ich muss den Namen der aktuellen Ansicht zurück an den Controller übergeben - so, wenn es z.B. Validierungsfehler gibt, kann ich die ursprüngliche Ansicht neu zu zeichnen.

Eine Umgehung wäre (in den Controller-Methoden) wie folgt

var viewName = "Details"; // or whatever
ViewData["viewName"] = viewName;
return(View(viewName, customer));

und dann in dem Teilstück selbst, geben Sie es als

<input type="hidden" name="viewName" 
    value="<%=Html.Encode(ViewData["viewName"])%>" />

Frage ist - gibt es einige Eigenschaft oder Syntax, die ich verwenden können, um diese direkt abrufen, anstatt es aus dem Controller zu setzen? Ich habe das Offensichtliche versucht:

<input type="hidden" name="viewName" 
    value="<%=Html.Encode(this.Name)%>" />

aber das funktioniert nicht. Was übersehe ich hier?

Gracias.

36voto

Haacked Punkte 56079

Nun, wenn es Ihnen nichts ausmacht, dass Ihr Code an die spezifische View Engine gebunden ist, die Sie verwenden, können Sie sich die ViewContext.View Eigenschaft und überführt sie in WebFormView

var viewPath = ((WebFormView)ViewContext.View).ViewPath;

Ich glaube, so erhalten Sie den Namen der Ansicht am Ende.

EDIT: Haacked ist absolut goldrichtig; um die Dinge etwas übersichtlicher zu gestalten, habe ich die Logik in eine Erweiterungsmethode eingewickelt, und zwar so:

public static class IViewExtensions {
    public static string GetWebFormViewName(this IView view) {
        if (view is WebFormView) {
            string viewUrl = ((WebFormView)view).ViewPath;
            string viewFileName = viewUrl.Substring(viewUrl.LastIndexOf('/'));
            string viewFileNameWithoutExtension = Path.GetFileNameWithoutExtension(viewFileName);
            return (viewFileNameWithoutExtension);
        } else {
            throw (new InvalidOperationException("This view is not a WebFormView"));
        }
    }
}

die genau das zu tun scheint, was ich gesucht habe.

17voto

Konamiman Punkte 48557

Ich hatte das gleiche Problem, und so habe ich es gelöst:

namespace System.Web.Mvc
{
    public static class HtmlHelperExtensions
    {
        public static string CurrentViewName(this HtmlHelper html)
        {
            return System.IO.Path.GetFileNameWithoutExtension(
                ((RazorView)html.ViewContext.View).ViewPath
            );
        }
    }
}

Dann in der Ansicht:

var name = Html.CurrentViewName();

oder einfach

@Html.CurrentViewName()

9voto

Daniel Elliott Punkte 22239

Wenn Sie nur den Namen der Aktion benötigen, ist dies der richtige Weg:

public static string ViewName(this HtmlHelper html)
{
    return html.ViewContext.RouteData.GetRequiredString("action");
}

5voto

Mahib Punkte 3767

Die einfachste Lösung ist die Verwendung von ViewBag.

public ActionResult Index()
    {
        ViewBag.CurrentView = "Index";
        return View();
    }

Auf der Seite cshtml

@{
var viewName = ViewBag.CurrentView;
}

Oder,

((RazorView)ViewContext.View).ViewPath

4voto

Miros Punkte 497

Wenn Sie den Dateinamen aus einer Teilansicht abrufen möchten, scheint dies zu funktionieren:

public static class HtmlHelperExtensions
{
    public static string GetViewFileName(this HtmlHelper html, object view)
    {
        return @"\\"+ view.GetType().FullName.Replace("ASP._Page_", "").Replace("_cshtml", ".cshtml").Replace("_", @"\\");
    }
}

Und in der Teilansicht sollten Sie etwa so vorgehen:

var filename = Html.GetViewFileName(this);

oder dies:

@Html.GetViewFileName(this)

Bitte kommentieren Sie, wenn dies kein guter Ansatz ist - gibt es Alternativen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X