سؤال

لدي تطبيق ASP.NET MVC مع عرض معين يحتوي على نموذج مع أ float منشأه.

موقع الخادم الخاص بي يقول ذلك , هو رمز عشري ويعمل بشكل جيد عندما أقوم بتحرير النموذج الخاص بي وأدخل على سبيل المثال 7,5 في مربع النص ونشره إلى الخادم. الموثق النموذج الافتراضي قادر على ربط هذه القيمة كما هو متوقع سبعة ونصف.

ولكن عندما أعرض نفس القيمة باستخدام <%= this.Model.FloatValue %>, ، يتم تحويل الرمز العشري إلى . وهو ما يعني أن <%= %> من الواضح أن يتجاهل إعدادات لغة الخادم.

لذا. كيف يمكنني حل هذه المشكلة إذن؟ أي لغة يجب استخدامها؟ لغة نظام الخادم التي تقول أن الرمز العشري , أو إعداد لغة المتصفح الذي تم تعيينه على en-gb, ، وهو ما يعني أن . هو رمز عشري.

على أي حال. أنا فقط أريد أن يعمل هذا بشكل موثوق.

بعض الكود:

تصرفات وحدة التحكم الخاصة بي:

public ActionResult Settings()
{
    Settings result = this.Service.GetActiveSettings();
    return View(result);
}

[HttpPost]
[HandleModelStateException]
public ActionResult Settings(Settings data)
{
    if (!this.ModelState.IsValid)
    {
        throw new ModelStateException(); // my custom exception which isn't important here
    }
    Settings result = this.Service.SaveSettings(data);
    return Json(result);
}

والثاني يسمى بشكل غير متزامن باستخدام $.ajax().

الجزء ذي الصلة من العرض الجزئي:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Settings>" %>
<div class="data">Float value: <strong><%= this.Model.FloatValue %></strong></data>
<div class="data">Integer value: <strong><%= this.Model.IntValue %></strong></data>
...

أي فئة نموذجية:

/// <summary>
/// Represents application specific settings.
/// </summary>
public class Settings
{
    /// <summary>
    /// Gets or sets the integer value.
    /// </summary>
    /// <value>Integer value.</value>
    [Required(ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "QuotaRequired")]
    [Range(0, 365*24, ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "QuotaRange")]
    public int IntValue { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "WorkdayRequired")]
    [Range(.5, 24.0, ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "WorkdayRange")]
    public float FloatValue { get; set; }
}

كما ترى ، لا يوجد شيء غير عادي هنا. أوه و / راجع للشغل: التحقق من صحة النطاق FloatValue لا يعمل أيضًا.

هل كانت مفيدة؟

المحلول 2

باستخدام العرف CultureInfo عند التحويل إلى سلسلة

في النهاية استخدمت ToString() الطريقة وتوفير معلومات الثقافة المناسبة. اضطررت إلى تقديم المزيد من التعليمات البرمجية ، لكنه يعمل كما هو متوقع:

<%= this.Model.FloatValue.ToString(new System.Globalization.CultureInfo("sl-SI") %>

وعندما أحتاج إلى استخدام معلومات الثقافة هذه عدة مرات على نفس العرض ، أقوم ببساطة بإنشاء متغير عرض وتخزينه ثم إعادة استخدامه مع كل مثيل.

نصائح أخرى

هل حاولت تعطيل الثقافة القائمة على العميل؟ يمكنك العثور عليه في Web.Config ، System.Web Section.

<globalization enableClientBasedCulture="false"  />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top