2014-02-12 3 views
3

Я использую Asp.net MVC 4 и .NET 4.5. У меня есть таблица с одним столбцом, которое является десятичным, а не нулевым значением. Я создал бритву с использованием шаблона лесов MVC для модели, созданной инфраструктурой Entity для этой таблицы.Я не могу получить значение в текстовом поле, которое я разместил в контроллере

Теперь, когда мы вводим 0 или ничего (null) в текстовое поле десятичного свойства, на сервере оно приходит как 0. и после проверки оно отображается как ноль в текстовом поле.

есть ли способ, с помощью которого мы можем определить, является ли клиент введен ноль или нуль на поле так, что после поста назад, если проверка приходит, клиент получает значение, которое он/она отправила

Update 1

public partial class Student 
{ 
    public int StudentID { get; set; } 
    public string LastName { get; set; } 
    public string FirstMidName { get; set; } 
    public System.DateTime EnrollmentDate { get; set; } 
    public decimal RollNo { get; set; } 
} 

класс, который EF сгенерировал.

и видом я использовал

@Html.TextBox("Students[0].RollNo", Model.Students[0].RollNo) 

в моей модели, этот список этого класса является свойством.

+0

Где мой код? – Seany84

+0

Как вы пытаетесь прочитать значение этого текстового поля? Это через javascript? или вы пытаетесь прочитать его после отправки формы? Трудно сказать, какова ваша проблема только с кодом, который вы опубликовали. – Gjohn

+0

У меня есть html.beginfrom метод mvc. Подлинная модель MVC по умолчанию считывает значения и присваивает модели – hajirazin

ответ

3

Я рекомендовал бы использовать атрибут пользовательские проверки, как descriped здесь: ASP.NET MVC: Custom Validation by Data Annonation

public class MyAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     int temp; 

     if (!Int32.TryParse(value.ToString(), out temp)) 
      return false; 

     return true; 
    } 
} 

и украсить вашу собственность с [MyAttribute]

EDIT:

Поскольку пустое текстовое поле предоставляет нуль при пустом, просто измените ваше свойство на нулевое значение double?. Это должно представить нуль, который можно отделить от нуля.

public partial class Student 
{ 
    public int StudentID { get; set; } 
    public string LastName { get; set; } 
    public string FirstMidName { get; set; } 
    public System.DateTime EnrollmentDate { get; set; } 
    public decimal? RollNo { get; set; } 
} 

MSDN Nullable Types

Edit 2:

Как у вас нет influencs на модели и не хотите использовать ViewModels и backupproperties, вот другой подход: с помощью настраиваемого ModelBinder.

public class DoubleModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (string.IsNullOrEmpty(valueResult.AttemptedValue)) 
     { 
      return double.NaN; 
     } 
     return valueResult; 
    } 
} 

protected void Application_Start() 
{ 
    ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
} 

Это дает вам постоянное значение double.NaN в вашей модели, если представленное значение пуст. Надеюсь это поможет.

+0

Ваш код ограничит ноль. где, как и в моем случае 0, разрешено, но отправка содержимого пустого текста не допускается – hajirazin

+0

, вы можете связать с дополнительным строковым свойством. Если текстовое поле пуст, оно отправляет «». 'Int32.TryParse' не удастся. – csteinmueller

+0

Но это заставит меня поддерживать два поля для столбца БД. то есть когда когда-либо я извлекаю данные, мне нужно назначить ему резервное копирование свойства строки, и когда я когда-либо сохраняю данные, мне нужно взять строковое значение и присвоить его первоначальному десятичному значению. Это утомительно. Мне нужно лучшее решение. – hajirazin

-1

Использование [Required] И [DisplayFormat] Аннотация ограничить пользователя поставить нулевое значение и формат десятичного значения на текстовое поле соответственно ..

public partial class Student 
{ 
    public int StudentID { get; set; } 
    public string LastName { get; set; } 
    public string FirstMidName { get; set; } 
    public System.DateTime EnrollmentDate { get; set; } 
    [Required] 
    [DisplayFormat(DataFormatString = "{0:0.###}")] 
    public decimal RollNo { get; set; } 
} 
+0

. Decimal не может быть отменена, если вы не укажете ее. – DevEstacion

+0

Как сказано @RonaldEstacion decimal не может быть null, когда я отправляю 0 или null, связующее устройство MVC изменит его на 0. – hajirazin

+0

@RonaldEstacion есть ли у вас какая-то идея? – hajirazin

-1

Попробуйте сделать это следующим образом:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

поставить эту внутреннюю форму:

@using (Ajax.BeginForm("Action", "Controller",null, new AjaxOptions{}) 
{ 
    @for(int i=0;i<Model.Students.Count;i++) 
    { 
     @Html.TextBoxFor(c=>Model.Students[i].RollNo) 
    } 
     <input type="submit" value ="submit"/> 
} 

An в настоящее время с помощью Data-аннотацию на вашей модели вы можете сделать вам логику, используя необходимый тег или MIN, MAX и т. Д. Не забудьте сделать ClientValidationEnabled=true в веб-конфигурации и включить в свой Layout jquery.unobtrusive-ajax.js. Поступая таким образом, вы можете запретить пользователю отправлять форму, если модель недействительна!

Если вы хотите получить больше аннотаций данных, просто установите пакет DataAnnotationsExtensions. У вас будет много полезных меток для аннотаций. Надеюсь, это поможет.

Примечание: * Min, Max по умолчанию не включены, вы можете иметь их с помощью DataAnnotationsExtensions *

+0

Мне не нужна минимальная и максимальная проверка. Моя задача - отличать нуль и нуль. – hajirazin

+0

, чем это очень просто, сделайте свой элемент нулевым. получит null, когда это si null и 0, когда это будет 0 – MDDDC

+0

У меня нет контроля над моделью, поскольку она генерируется сущностью. Я не могу изменить свой столбец DB на nullab le, так как он используется другими приложениями, а также – hajirazin

3

десятичного не нулевое значение [...] есть ли способ, с помощью которого мы можем определить. имеет ли клиент введен ноль или нуль на поле так, что после поста назад, если проверка приходит, клиент получает значение, которое он/она отправила

Да, с помощью ViewModel с десятичным свойством, что является nullable. В любом случае вы не должны использовать модели Entity Framework в качестве моделей просмотров.

+0

это правда, и это тоже работает, но я не хотел постоянно разговаривать с моделью и viewmodel, когда я извлекаю данные и каждый раз, когда я их сохраняю. Поэтому я решил использовать модель напрямую. Есть ли какие-либо способы, с помощью которых мы можем справиться с этим? – hajirazin

+1

@haji не то, что я знаю. Точка - ваш контроллер не знает разницы 0, введенных пользователем, и 0 в качестве десятичного значения по умолчанию. Это может быть известно в связующем, а затем см. Ответ @ csteinmueller: если значение установлено в 'double.NaN' (специальное значение), вход был пуст и поэтому вы не обновляете свою запись. – CodeCaster

+0

У нас есть что-то вроде NaN в десятичной форме? – hajirazin

Смежные вопросы