gpt4 book ai didi

c# - Html.CheckBoxFor 类型转换错误

转载 作者:太空狗 更新时间:2023-10-30 01:33:21 25 4
gpt4 key购买 nike

我有一个 View 模型:

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

我在我的 View 中使用了复选框助手:

@model RegisterModel

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

此复选框 html 帮助程序创建:

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

在 Controller 上

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

假设一些用户将输入值更改为“xxx”并发布。因此,模型无效,我们返回 View 。之后,Html.CheckBoxFor 给出了这个错误:

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

内部异常:

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

当我们返回 View 时:Model.Confirmation 值为 falseRequest["Confirmation"] 值为 'xxx' .

此错误来自 ConvertSimpleType 方法上的 ValueProviderResult 类。我认为,它试图将 Request["Confirmation"] 值转换为 bool 值,但它给出了错误。

[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);
}

.....
}

如何修复或避免此错误?

最佳答案

根据@StephenMuecke 的说法,这是默认行为。详细可以查看answer

根据@ataravati,我们应该在 model.IsValid==false 上处理这个问题。如果模型无效,我们删除复选框的值并分配新的值。因此,当我们返回 View 时,我们不会收到任何错误。

 if (!ModelState.IsValid)
{
bool confirmation;

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

根据@StephenMuecke 的说法,如果复选框输入值不是 bool 值,则用户肯定是恶意的。因此,我们将用户重定向到另一个具有跟踪/阻止 ip 算法的操作,并返回 404 作为 View 。

  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.
}

关于c# - Html.CheckBoxFor 类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com