Как установить скрытое значение в Razor - PullRequest
35 голосов
/ 29 июня 2011

Я знаю, что то, что я пытаюсь сделать, - плохая идея, но у меня пока есть определенные ограничения.

У меня есть несколько сайтов, использующих одну и ту же кодовую базу MVC3.Для одного из них требование состоит в том, чтобы скрыть некоторые обязательные поля из формы.

Я знаю, что наилучшим подходом является изменение контроллера для установки значений по умолчанию для этих полей, но я хотел бы добиться этого изменениятолько представление для этого конкретного сайта без изменения кода.

Итак, как мне установить для свойства конкретной модели значение по умолчанию в представлении?В идеале должно быть что-то вроде:

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

РЕДАКТИРОВАТЬ: больше объяснения

Таким образом, на самом деле это в подвиде, который используется 2 различными основными видами.Мне нужно, чтобы эти свойства устанавливались только в том случае, если используется один конкретный главный вид, а не другие.

Итак, я полагаю, что для установки по умолчанию необходимо перейти к этому конкретному «основному» представлению.Похоже, я не могу использовать HiddenFor во вспомогательном представлении, а затем Html.Hidden в основном.

Есть ли способ проверить вспомогательное представление, являющееся внешним представлением?

Ответы [ 4 ]

68 голосов
/ 07 сентября 2011

Если я правильно понимаю, у вас будет что-то вроде этого:

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

И чтобы получить его, нужно написать:

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

для строго типизированного представления.

35 голосов
/ 29 июня 2011

Рядом с HiddenFor есть помощник Hidden, который позволяет вам установить значение.

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

РЕДАКТИРОВАТЬ Исходя из внесенного вами изменения в вопрос, вы можете сделать это, но Я полагаю, что вы перемещаетесь на территорию, где это будет дешевлеи, в конечном счете, более эффективно бороться за изменение кода .Как уже было сказано, контроллером или моделью представления должен быть установлен по умолчанию.

Этот код:

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

будет выдавать вывод, подобный следующему:

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

Таким образом, предполагая, что среда MVC всегда будет проходить через один и тот же стек, вы можете получить1018 * и используйте декларирующий тип, чтобы определить, кто является вашим родительским представлением, а затем используйте это определение, чтобы установить (или нет) значение по умолчанию.Вы также можете пройтись по стеку вместо прямого захвата [8], который был бы более безопасным, но даже менее эффективным.

10 голосов
/ 23 июня 2014

Хотя я бы согласился с ответом Петра (потому что все в одной строке), я был удивлен, что ваш образец ближе к вашему решению, чем вы думаете. Исходя из того, что у вас есть, вы просто присваиваете значение модели, прежде чем использовать вспомогательный метод Html.

@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)
0 голосов
/ 22 января 2014

Как насчет этого

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

Используйте это так

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