gpt4 book ai didi

asp.net-mvc - ASP.NET MVC Textbox HtmlHelper 的 NullReferenceException 问题

转载 作者:行者123 更新时间:2023-12-02 05:08:42 24 4
gpt4 key购买 nike

我的应用程序的强类型 View 中有以下代码:

<td>
<label for="TriageStartDate">Triage Start:</label>
<%= Html.TextBox("TriageStartDate", crit.TriageStartDate, new { maxlength = 10, size = 12 } )%>
<%= Html.ValidationMessage("TriageStartDate", "*") %>
</td>

变量crit在ViewData中传递,并使用以下方法将其转换为 View 中的强类型对象:

   PatientSearchCriteria crit = (PatientSearchCriteria)ViewData["criteria"];       

属性 TriageStartDate 是在对象上定义的字符串属性,如下所示:

public string TriageStartDate { get; set; }

我在业务对象中有一个验证例程,用于检查此属性是否存在无效日期。验证例程在我的 Controller 中调用,并且在 Controller 中,当发现无效日期(例如“4/34/2009”)时,我将 ModelError 添加到 ModelState。这应该会导致 View 被重新显示,并且验证摘要和消息也会被显示。

但是,代码在 Html.TextBox 行上崩溃,并出现未处理的 NullReferenceException。代码在输入无效日期时崩溃,这可能不重要,因为该属性无论如何都是一个字符串,并且它应该只在文本框中显示无效日期。

你知道这里可能发生什么吗?我认为这可能是 Html.Encode 的事情,但有效日期显示没有大惊小怪。当我在 Debug模式下中断该行时,我可以在 TriageStartDate 属性中看到值“4/34/2009”,并且 crit 变量本身不为 null,所以我想知道什么对象为 null?

顺便说一句,堆栈跟踪的前几行如下所示:

[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Mvc.HtmlHelper.GetModelStateValue(String key, Type destinationType) +63
System.Web.Mvc.Html.InputExtensions.InputHelper(HtmlHelper htmlHelper, InputType inputType, String name, Object value, Boolean useViewData, Boolean isChecked, Boolean setId, Boolean isExplicitValue, IDictionary`2 htmlAttributes) +519
System.Web.Mvc.Html.InputExtensions.TextBox(HtmlHelper htmlHelper, String name, Object value, IDictionary`2 htmlAttributes) +34
System.Web.Mvc.Html.InputExtensions.TextBox(HtmlHelper htmlHelper, String name, Object value, Object htmlAttributes) +62

这是我的验证代码(可能不太漂亮)。在业务对象中:

public override IEnumerable<ValidationError> GetValidationErrors()
{
// check for valid start date
if (!String.IsNullOrEmpty(TriageStartDate))
{
DateTime critStartDate;
if (!DateTime.TryParse(TriageStartDate, out critStartDate))
yield return new ValidationError(String.Format("Invalid triage start date specified: {0}", TriageStartDate), "TriageStartDate");
}

// check for valid end date
if (!String.IsNullOrEmpty(TriageEndDate))
{
DateTime critEndDate;
if (!DateTime.TryParse(TriageEndDate, out critEndDate))
yield return new ValidationError(String.Format("Invalid triage end date specified: {0}", TriageEndDate), "TriageEndDate");
}

// verify that end date follows start date if both are specified
if (!String.IsNullOrEmpty(TriageStartDate) && !String.IsNullOrEmpty(TriageEndDate))
{
DateTime startDate;
DateTime endDate;

if (DateTime.TryParse(TriageStartDate, out startDate) && DateTime.TryParse(TriageEndDate, out endDate))
{
if (startDate > endDate)
yield return new ValidationError("Triage start date must be before end date", "_FORM");
}
}

yield break;
}

在 Controller 中:

    // validate search criteria
if (!criteria.IsValid)
{
foreach (ValidationError ve in criteria.GetValidationErrors())
{
ModelState.AddModelError(ve.PropertyName, ve.ErrorMessage);
}
}

感谢您提供任何线索!

<小时/>

感谢 Craig 的建议,我按如下方式更新了 Controller 代码,并且空引用异常消失了。该解决方案有效,但我不确定我是否理解其基本原理,因为用户尝试输入的值已存储在模型对象中,并且项目中的其他 View 和 Controller 以相同的方式显示验证错误,而无需任何问题。但是,嘿,如果它有效的话......

    // validate search criteria
if (!criteria.IsValid)
{
foreach (ValidationError ve in criteria.GetValidationErrors())
{
ModelState.AddModelError(ve.PropertyName, ve.ErrorMessage);
ModelState.SetModelValue(ve.PropertyName, form.ToValueProvider()[ve.PropertyName]);
}

}

最佳答案

调用 AddModelError 后,您需要调用 SetModelValue 。这应该修复空引用。

关于asp.net-mvc - ASP.NET MVC Textbox HtmlHelper 的 NullReferenceException 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826684/

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