wake-up-neo.com

So legen Sie einen versteckten Wert in Razor fest

Ich weiß, dass das, was ich zu tun versuche, eine schlechte Idee ist, aber ich habe vorerst bestimmte Einschränkungen.

Ich habe mehrere Standorte, die dieselbe MVC3-Codebasis verwenden. Für eines davon müssen einige erforderliche Felder im Formular ausgeblendet werden.

Ich weiß, dass der beste Ansatz darin besteht, den Controller zu ändern, um die Standardwerte für diese Felder festzulegen. Ich möchte jedoch nur die Ansicht für diese bestimmte Site ändern, ohne den Code zu ändern.

Wie kann ich also eine bestimmte Modelleigenschaft in der Ansicht auf einen Standardwert setzen? Das Ideal sollte so etwas wie sein:

@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"

EDIT: weitere Erklärung

Das ist also eigentlich eine Unteransicht, die von zwei verschiedenen Hauptansichten verwendet wird. Ich brauche diese Eigenschaften nur, wenn eine bestimmte Hauptansicht verwendet wird und nicht die anderen.

Ich denke, die Standardeinstellung muss zu dieser speziellen "Hauptansicht" gehen. Sieht aus wie ich HiddenFor nicht in der Unteransicht und dann Html.Hidden in der Hauptansicht verwenden kann.

Gibt es eine Möglichkeit, in der Unteransicht, der Außenansicht, zu überprüfen?

32
Sunny Milenov

Neben Hidden gibt es einen Helfer HiddenFor, mit dem Sie den Wert einstellen können. 

@Html.Hidden("RequiredProperty", "default")

EDITBasierend auf der Bearbeitung, die Sie an der Frage vorgenommen haben, können Sie dies tun, aber ich glaube, Sie ziehen in ein Gebiet, in dem es auf lange Sicht billiger und effektiver sein wird für die Codeänderung kämpfen . Wie bereits gesagt, sollte der Controller oder das Ansichtsmodell selbst die Standardeinstellung festlegen. 

Dieser Code:

<ul>
@{
        var stacks = new System.Diagnostics.StackTrace().GetFrames();
        foreach (var frame in stacks)
        {
            <li>@frame.GetMethod().Name - @frame.GetMethod().DeclaringType</li>
        }
}
</ul>

Wird Ausgabe wie folgt geben:

Execute - ASP._Page_Views_ViewDirectoryX__SubView_cshtml
ExecutePageHierarchy - System.Web.WebPages.WebPageBase
ExecutePageHierarchy - System.Web.Mvc.WebViewPage
ExecutePageHierarchy - System.Web.WebPages.WebPageBase
RenderView - System.Web.Mvc.RazorView
Render - System.Web.Mvc.BuildManagerCompiledView
RenderPartialInternal - System.Web.Mvc.HtmlHelper
RenderPartial - System.Web.Mvc.Html.RenderPartialExtensions
Execute - ASP._Page_Views_ViewDirectoryY__MainView_cshtml

Vorausgesetzt, dass das MVC-Framework immer denselben Stack durchläuft, können Sie var frame = stacks[8]; verwenden und den deklarierenden Typ verwenden, um zu bestimmen, wer Ihre übergeordnete Ansicht ist, und dann diese Festlegung zum Festlegen (oder nicht) des Standardwerts verwenden. Sie können auch den Stapel durchlaufen, anstatt direkt [8] zu greifen, was sicherer, aber auch weniger effizient wäre.

31
David Ruttka

Wenn ich richtig verstehe, wirst du so etwas haben:

<input value="default" id="sth" name="sth" type="hidden">

Und um es zu bekommen, musst du schreiben:

@Html.HiddenFor(m => m.sth, new { Value = "default" })

für stark typisierte Ansicht.

67
Piotr Czyż

Obwohl ich mit Piotrs Antwort gegangen wäre (weil alles in einer Zeile steht), war ich überrascht, dass Ihre Probe näher an Ihrer Lösung liegt, als Sie denken. Von dem, was Sie haben, weisen Sie einfach den Modellwert zu, bevor Sie die Html-Helper-Methode verwenden.

@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)
10
alans

Wie wäre es damit?

public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, object htmlAttributes)
    {
        return HiddenFor(htmlHelper, expression, value, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, IDictionary<string, object> htmlAttributes)
    {
        return htmlHelper.Hidden(ExpressionHelper.GetExpressionText(expression), value, htmlAttributes);
    }

Verwenden Sie es so

 @Html.HiddenFor(customerId => reviewModel.CustomerId, Site.LoggedInCustomerId, null)
0
mimo