asp.net mvc 3 - net - Cómo establecer un valor oculto en Razor
hiddenfor razor (4)
Sé que lo que estoy tratando de hacer es una mala idea, pero tengo restricciones específicas por ahora.
Tengo varios sitios, usando una y la misma base de código MVC3. Para uno de ellos, el requisito es ocultar algunos campos obligatorios del formulario.
Sé que el mejor enfoque es modificar el controlador para establecer los valores predeterminados para estos campos, pero me gustaría lograr esto modificando solo la vista de este sitio en particular sin cambiar el código.
Entonces, ¿cómo configuro una propiedad de modelo particular a un valor predeterminado en la vista? El ideal debería ser algo como:
@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"
EDITAR: más explicaciones
Entonces, en realidad esto se encuentra en una subvista, que es utilizada por 2 vistas principales diferentes. Necesito que estas propiedades se establezcan solo si se usa una vista principal particular y no las otras.
Entonces, supongo que la configuración predeterminada debe ir a esa vista "principal" en particular. Parece que no puedo usar HiddenFor en la sub-vista, y luego Html.Hidden en el principal.
¿Hay alguna manera de verificar en la subvista, que es la vista exterior?
¿Qué tal esto?
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);
}
Úselo así
@Html.HiddenFor(customerId => reviewModel.CustomerId, Site.LoggedInCustomerId, null)
Hay un asistente Hidden
junto con HiddenFor
que le permite establecer el valor.
@Html.Hidden("RequiredProperty", "default")
EDITAR Basándote en la edición que hiciste de la pregunta, podrías hacer esto, pero creo que te estás moviendo hacia un territorio donde será más barato y más efectivo, a largo plazo, para luchar por hacer que el código cambie . Como se ha dicho, incluso usted mismo, el controlador o modelo de vista debe establecer el valor predeterminado.
Este código:
<ul>
@{
var stacks = new System.Diagnostics.StackTrace().GetFrames();
foreach (var frame in stacks)
{
<li>@frame.GetMethod().Name - @frame.GetMethod().DeclaringType</li>
}
}
</ul>
Dará un resultado como este:
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
Asumiendo que el marco MVC siempre irá a través de la misma pila, puedes agarrar var frame = stacks[8];
y use el tipo de declaración para determinar quién es su vista principal, y luego use esa determinación para establecer (o no) el valor predeterminado. También podría caminar la pila en lugar de agarrar directamente [8]
que sería más seguro, pero aún menos eficiente.
Si bien me habría ido con la respuesta de Piotr (porque todo está en una línea), me sorprendió que su muestra esté más cerca de su solución de lo que cree. Por lo que tiene, simplemente asigne el valor del modelo antes de usar el método Html helper.
@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)
Si entiendo correcto, tendrá algo como esto:
<input value="default" id="sth" name="sth" type="hidden">
Y para obtenerlo debes escribir:
@Html.HiddenFor(m => m.sth, new { Value = "default" })
para la vista fuertemente tipada.