2015-12-04 3 views
4

У меня есть вид модели:Html.CheckBoxFor TypeConversition Ошибка

public class RegisterModel 
{ 
    ... 
    public bool Confirmation{ get; set; } 
} 

Я использую флажок помощника на мой взгляд:

@model RegisterModel 

...... 
@Html.CheckBoxFor(m => m.Confirmation) 

Этот флажок HTML помощник создает:

<input id="Confirmation" name="Confirmation" value="true" type="checkbox"> 
<input name="Confirmation" value="false" type="hidden"> 

На Контроллер

[HttpPost] 
[ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
{ 
    if (!ModelState.IsValid) 
       return View(model); 
..... 
} 

Предположим, что некоторые пользователи меняют значения входов на «xxx» и публикуют его. Поэтому модель недействительна и мы возвращаем представление. После этого, Html.CheckBoxFor дает эту ошибку:

The parameter conversion from type 'System.String' to type 'System.Boolean' failed.

Внутренняя Исключение:

System.FormatException: xxx is not a valid value for Boolean

Когда мы возвращаем вид: Model.Confirmation значение ложно но Request["Confirmation"] значение «ххх».

Эта ошибка исходит от ValueProviderResult класс по методу ConvertSimpleType. Я думаю, он пытается преобразовать значение Request["Confirmation"] в значение boolean и дает ошибку.

[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Conversion failure is not fatal")] 
private static object ConvertSimpleType(CultureInfo culture, object value, Type destinationType) 
{ 

..... 
    TypeConverter converter = TypeDescriptor.GetConverter(destinationType); 
    bool canConvertFrom = converter.CanConvertFrom(value.GetType()); 
    if (!canConvertFrom) 
    { 
     converter = TypeDescriptor.GetConverter(value.GetType()); 
    } 
    if (!(canConvertFrom || converter.CanConvertTo(destinationType))) 
    { 
     // EnumConverter cannot convert integer, so we verify manually 
     if (destinationType.IsEnum && value is int) 
     { 
      return Enum.ToObject(destinationType, (int)value); 
     } 
      string message = String.Format(CultureInfo.CurrentCulture, MvcResources.ValueProviderResult_NoConverterExists, 
              value.GetType().FullName, destinationType.FullName); 
     throw new InvalidOperationException(message); 
    } 

..... 
} 

Как я могу исправить или избежать этой ошибки?

+1

Это странно. Почему «CheckBoxFor» создает два входа с точно таким же именем? –

+0

«Предположим, что некоторые пользователи меняют значения входов на« xxx »и публикуют его». Что ты хочешь этим сказать? Вы имеете в виду, что пользователь меняет источник html? – ataravati

+0

Да @ataravati пользователь меняет источники и сообщения html. –

ответ

3

В соответствии с @StephenMuecke это поведение по умолчанию. Вы можете проверить подробные данные answer

Согласно @ataravati, мы должны обработать это на model.IsValid==false. Если модель недействительна, мы удаляем значение флажка и назначаем новый. Поэтому мы не получаем никаких ошибок, когда возвращаем представление.

if (!ModelState.IsValid) 
      { 
       bool confirmation; 

       bool.TryParse(Request["Confirmation"],out confirmation); 
       ModelState.Remove("Confirmation"); 
       request.Confirmation = confirmation; 
       return View(request); 
      } 

Согласно @StephenMuecke если вход флажок значение не логическое значение, то пользователь злостно наверняка. Поэтому мы перенаправляем пользователя на другое действие, которое имеет алгоритм отслеживания/блокировки ip и возвращает 404 как представление.

if (!ModelState.IsValid) 
      { 
       bool confirmation; 
       if (bool.TryParse(Request["Confirmation"], out confirmation)) 
        return View(request); 
       return RedirectToAction("Http404", "Errors"); //This not just redirecting 404, it has also tracking/blocking ip algorithm. 
      } 

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

  • Нет связанных вопросов^_^