Подтвердить что ты не робот

Как установить скрытое значение в Razor

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

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

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

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

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

EDIT: больше объяснений

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

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

Есть ли способ проверить внешний вид, который является внешним видом?

4b9b3361

Ответ 1

Рядом с 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 всегда будет проходить через один и тот же стек, вы можете захватить var frame = stacks[8]; и использовать тип объявления, чтобы определить, кто является вашим родительским представлением, а затем использовать это определение для установки (или отсутствия) значения по умолчанию. Вы также можете ходить в стек вместо прямого захвата [8], который был бы более безопасным, но даже менее эффективным.

Ответ 2

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

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

И для этого вам нужно написать:

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

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

Ответ 3

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

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

Ответ 4

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

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)