В C # с ASP.NET MVC я не могу назначить значение в поле даты в POST обратно с ModelState.clear () [duplicate]

Используйте функцию callback() внутри успеха foo(). Попробуйте таким образом. Это просто и легко понять. & nbsp;

var lat = "";
var lon = "";
function callback(data) {
    lat = data.lat;
    lon = data.lon;
}
function getLoc() {
    var url = "http://ip-api.com/json"
    $.getJSON(url, function(data) {
        callback(data);
    });
}

getLoc();
186
задан Peter Mortensen 11 October 2014 в 14:42
поделиться

8 ответов

Когда вы украшаете свойство модели с помощью [DataType(DataType.Date)], шаблон по умолчанию в ASP.NET MVC 4 генерирует поле ввода type="date":

<input class="text-box single-line" 
       data-val="true" 
       data-val-date="The field EstPurchaseDate must be a date."
       id="EstPurchaseDate" 
       name="EstPurchaseDate" 
       type="date" value="9/28/2012" />

Браузеры, поддерживающие HTML5, такие как Google Chrome, делают это поле ввода с установщиком даты.

Чтобы правильно отобразить дату, значение должно быть отформатировано как 2012-09-28. Цитата из спецификации :

value: действительная полная дата, определенная в [RFC 3339], с дополнительной квалификацией, что компонент года состоит из четырех или более цифр представляющее число больше 0.

Вы можете применить этот формат с помощью атрибута DisplayFormat:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public Nullable<System.DateTime> EstPurchaseDate { get; set; }
358
ответ дан Colin 24 August 2018 в 21:16
поделиться

Если вы удалите [DataType(DataType.Date)] из своей модели, поле ввода в Chrome будет отображаться как type="datetime" и не покажет дату.

9
ответ дан AlexB 24 August 2018 в 21:16
поделиться

В качестве дополнения к ответу Дарина Димитрова:

Если вы хотите, чтобы эта конкретная строка использовала определенный (отличный от стандартного) формат, вы можете использовать в MVC5:

@Html.EditorFor(model => model.Property, new {htmlAttributes = new {@Value = @Model.Property.ToString("yyyy-MM-dd"), @class = "customclass" } })
15
ответ дан Arjan 24 August 2018 в 21:16
поделиться

В MVC 3 мне пришлось добавить:

using System.ComponentModel.DataAnnotations;

среди пользователей при добавлении свойств:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

Особенно, если вы добавляете эти свойства в .edmx-файл, как я , Я обнаружил, что по умолчанию файлы .edmx не имеют этого, поэтому добавления только пропозиций недостаточно.

10
ответ дан Azoro 24 August 2018 в 21:16
поделиться

Ответить в MVC4 DataType.Date EditorFor не отображает значение даты в Chrome, отлично в IE

. В модели вам необходимо иметь следующий тип объявления:

[DataType(DataType.Date)]
public DateTime? DateXYZ { get; set; }

OR

[DataType(DataType.Date)]
public Nullable<System.DateTime> DateXYZ { get; set; }

Вам не нужно использовать следующий атрибут:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

В Date.cshtml используйте этот шаблон:

@model Nullable<DateTime>
@using System.Globalization;

@{
    DateTime dt = DateTime.Now;
    if (Model != null)
    {
        dt = (System.DateTime)Model;

    }

    if (Request.Browser.Type.ToUpper().Contains("IE") || Request.Browser.Type.Contains("InternetExplorer"))
    {
        @Html.TextBox("", String.Format("{0:d}", dt.ToShortDateString()), new { @class = "datefield", type = "date" })
    }
    else
    {
        //Tested in chrome
        DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat;
        dtfi.DateSeparator = "-";
        dtfi.ShortDatePattern = @"yyyy/MM/dd"; 
        @Html.TextBox("", String.Format("{0:d}", dt.ToString("d", dtfi)), new { @class = "datefield", type = "date" })
    } 
}

Повеселись! С уважением, Блэртон

3
ответ дан Blerton Hoxha 24 August 2018 в 21:16
поделиться

В MVC5.2 добавьте Date.cshtml в папку ~ / Views / Shared / EditorTemplates:

@model DateTime?
@{
    IDictionary<string, object> htmlAttributes;
    object objAttributes;
    if (ViewData.TryGetValue("htmlAttributes", out objAttributes))
    {
        htmlAttributes = objAttributes as IDictionary<string, object> ?? HtmlHelper.AnonymousObjectToHtmlAttributes(objAttributes);
    }
    else
    {
        htmlAttributes = new RouteValueDictionary();
    }
    htmlAttributes.Add("type", "date");
    String format = (Request.UserAgent != null && Request.UserAgent.Contains("Chrome")) ? "{0:yyyy-MM-dd}" : "{0:d}";
    @Html.TextBox("", Model, format, htmlAttributes)
}
38
ответ дан Charlie 24 August 2018 в 21:16
поделиться

Если вам нужно иметь контроль над форматом даты (другими словами, не только формат yyyy-mm-dd является приемлемым), другим решением может быть добавление вспомогательного свойства, которое имеет строку типа и добавляет валидатор даты к этому свойству и привязать это свойство к UI.

    [Display(Name = "Due date")]
    [Required]
    [AllowHtml]
    [DateValidation]
    public string DueDateString { get; set; }

    public DateTime? DueDate 
    {
        get
        {
            return string.IsNullOrEmpty(DueDateString) ? (DateTime?)null : DateTime.Parse(DueDateString);
        }
        set
        {
            DueDateString = value == null ? null : value.Value.ToString("d");
        }
    }

И вот валидатор даты:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public class DateValidationAttribute : ValidationAttribute
{
    public DateValidationAttribute()
    {
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            DateTime date;

            if (value is string)
            {
                if (!DateTime.TryParse((string)value, out date))
                {
                    return new ValidationResult(validationContext.DisplayName + " must be a valid date.");
                }
            }
            else
                date = (DateTime)value;

            if (date < new DateTime(1900, 1, 1) || date > new DateTime(3000, 12, 31))
            {
                return new ValidationResult(validationContext.DisplayName + " must be a valid date.");
            }
        }
        return null;
    }
}
1
ответ дан Martin Staufcik 24 August 2018 в 21:16
поделиться

У меня все еще была проблема с передачей формата yyyy-MM-dd, но я обошел его, изменив Date.cshtml:

@model DateTime?

@{
    string date = string.Empty;
    if (Model != null)
    {
        date = string.Format("{0}-{1}-{2}", Model.Value.Year, Model.Value.Month, Model.Value.Day);
    }

    @Html.TextBox(string.Empty, date, new { @class = "datefield", type = "date"  })
}
4
ответ дан Peter Mortensen 24 August 2018 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: