Как установить скрытое значение в Razor
Я знаю, что то, что я пытаюсь сделать, это плохая идея, но на данный момент у меня есть определенные ограничения.
У меня есть несколько сайтов, используя одну и ту же базу кода MVC3. Для одного из них необходимо скрыть некоторые обязательные поля из формы.
Я знаю, что лучший подход состоит в том, чтобы изменить контроллер, чтобы установить значения по умолчанию для этих полей, но я хотел бы добиться этого, изменяя только представление для этого конкретного сайта без изменения кода.
Итак, как мне установить конкретное свойство модели в значение по умолчанию в представлении? Идеал должен быть чем-то вроде:
@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"
EDIT: больше объяснений
Итак, на самом деле это в подзапросе, который используется двумя разными основными видами. Мне нужны эти свойства, только если используется один основной вид, а не другие.
Итак, я думаю, что настройка по умолчанию должна перейти к такому "основному" виду. Похоже, я не могу использовать HiddenFor в под-представлении, а затем Html.Hidden в главном.
Есть ли способ проверить внешний вид, который является внешним видом?
Ответы
Ответ 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)