c# - puedo - ¿Cómo renderizo solo algunos campos modelo específicos con InvariantCulture, mientras que el resto sigue usando la cultura de los usuarios?
como renderizar en lumion 6 (3)
Terminé creando una plantilla (Position.chtml) para una posición de subobjeto específica en mi modelo como esta:
@model Models.Position
@{
var latitude = string.Format(System.Globalization.CultureInfo.InvariantCulture,
"{0:G}", Model.Latitude);
var longitude = string.Format(System.Globalization.CultureInfo.InvariantCulture,
"{0:G}", Model.Longitude);
}
@Html.Hidden("Latitude", latitude)
@Html.Hidden("Longitude", longitude)
<p />
<div id="mapCanvas"></div>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/maps.js")"></script>
<script type="text/javascript">
$(function () {
attachMap($(''#mapCanvas''), $(''#Position_Latitude''), $(''#Position_Longitude''), true);
})
</script>
De esta forma, no necesito agregar ningún atributo a la clase de modelo.
Me pregunto sin embargo ... ¿es una buena práctica incluir javascript como este? No conozco otra forma de hacerlo (excepto que lo incluya en la página maestra, lo que no quiero hacer ya que no lo necesito en todas las páginas) sin tener que repetirlo. Me gustaría mantener este DRY ...
También (podría hacer una nueva pregunta para esto): como es ahora, tengo esta plantilla 2 veces, una como plantilla de editor, una como plantilla de visualización. La única diferencia es que el último parámetro para attachMap
debe ser true
para la plantilla del editor y false
para la plantilla de visualización. ¿Hay alguna manera fácil de hacer esto SECO?
Tengo un par de entradas ocultas en una vista asp.net mvc. Sus valores contienen objetos del tipo double
. Quiero que se muestren con InvariantCulture
ya que se utilizan para alimentar a una API (google maps) en el cliente. Como está ahora, se representan con una coma (,) como separador decimal, mientras que la API espera un punto (.) Como separador decimal.
La mejor solución sería si pudiera especificar una cultura en el DisplayFormat
de anotación de datos DisplayFormat
en la propiedad del modelo, pero no creo que eso sea posible:
public class Position
{
[DisplayFormat(DataFormatString="{0:G}, CultureInfo.InvariantCulture")]
public double Latitude;
...
}
Tampoco puedo simplemente configurar CurrentCulture
en InvariantCulture
en mi método Application_Start
, ya que hay otros valores en la pantalla que deben estar en la cultura de usuario adecuada.
Entonces, ¿hay alguna forma de cambiar temporalmente la cultura actual, justo antes de hacer un Html.HiddenFor(Model => Model.Latitude)
para esa propiedad específica, y luego reiniciarlo después?
¿O hay otra forma mejor de hacer esto? ¿Qué se considera la mejor práctica con respecto a esto?
Una forma de lograr esto sería escribir una plantilla de editor personalizado ~/Views/Shared/EditorTemplates/InvariantDouble.cshtml
:
@{
object modelValue = string.Format(
System.Globalization.CultureInfo.InvariantCulture,
ViewData.ModelMetadata.DisplayFormatString,
ViewData.ModelMetadata.Model
);
}
@Html.TextBox("", modelValue, new { @class = "text-box single-line" })
y luego en tu modelo:
[DisplayFormat(DataFormatString="{0:G}")]
[UIHint("InvariantDouble")]
public double Latitude;
y finalmente en su punto de vista:
@Html.EditorFor(x => x.Latitude)
o si desea que todos los dobles en su aplicación se comporten de esta manera, use ~/Views/Shared/EditorTemplates/Double.cshtml
sin ningún UIHint
.
public static MvcHtmlString HiddenForInvariant<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var id = string.Format("{0}", metadata.PropertyName);
var compile = expression.Compile();
string value = Convert.ToString(compile(htmlHelper.ViewData.Model), CultureInfo.InvariantCulture);
var hidden = htmlHelper.Hidden(id, value).ToHtmlString();
return new MvcHtmlString(hidden);
}