如果没有将模型类的实例传递给视图,如何避免Create.cshtml中的EditorFor(x = x.Prop)生成的nullexception?
约束:
- 我不想使用
Nullable
类型。 - 我不想在
HttpGet
Create
操作方法中实例化一个模型类。
型号类:
namespace MvcTest.Models { public enum Gender { Male, Female } public class Person { public Gender Gender { get; set; } } }
模板编辑助手(Gender.cshtml):
@using MvcTest.Models @model Gender @{ var genders = from Gender g in Enum.GetValues(typeof(Gender)) select new { Value = g, Text = g.ToString() }; var sl = new SelectList(genders, "Value", "Text", Model); } @Html.DropDownList(string.Empty, sl, "--Select--")
控制器:
using System.Web.Mvc; using MvcTest.Models; namespace MvcTest.Controllers { public class HomeController : Controller { public ActionResult Create() { //Person p = new Person(); //return View(p); return View(); } } }
视图:
@model MvcTest.Models.Person @using (Html.BeginForm()) { @Html.EditorFor(x => x.Gender)
}
错误:
Server Error in '/' Application. The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'MvcTest.Models.Gender'. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidOperationException: The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'MvcTest.Models.Gender'. Source Error: Line 3: { Line 4: Line 5: @Html.EditorFor(x => x.Gender) Line 6: Line 7: Source File: e:\MvcTest\MvcTest\Views\Home\Create.cshtml Line: 5 Stack Trace: [InvalidOperationException: The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'MvcTest.Models.Gender'.] System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) +143 System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) +377 System.Web.Mvc.WebViewPage`1.SetViewData(ViewDataDictionary viewData) +27 System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +99 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115 System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplate(HtmlHelper html, ViewDataDictionary viewData, String templateName, DataBoundControlMode mode, GetViewNamesDelegate getViewNames, GetDefaultActionsDelegate getDefaultActions) +584 System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData, ExecuteTemplateDelegate executeTemplate) +1027 System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData) +66 System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData, TemplateHelperDelegate templateHelper) +118 System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData) +100 System.Web.Mvc.Html.EditorExtensions.EditorFor(HtmlHelper`1 html, Expression`1 expression) +57 ASP._Page_Views_Home_Create_cshtml.Execute() in e:\MvcTest\MvcTest\Views\Home\Create.cshtml:5 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +207 System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +81 System.Web.WebPages.StartPage.RunPage() +19 System.Web.WebPages.StartPage.ExecutePageHierarchy() +65 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76 System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +220 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +303 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13 System.Web.Mvc.c__DisplayClass1c.b__19() +23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260 System.Web.Mvc.c__DisplayClass1e.b__1b() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343 System.Web.Mvc.Controller.ExecuteCore() +116 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10 System.Web.Mvc.c__DisplayClassb.b__5() +37 System.Web.Mvc.Async.c__DisplayClass1.b__0() +21 System.Web.Mvc.Async.c__DisplayClass8`1.b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 System.Web.Mvc.c__DisplayClasse.b__d() +50 System.Web.Mvc.SecurityUtil.b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8862381 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.225
问题:当没有将模型类的实例传递给视图时,如何避免Create.cshtml中的EditorFor(x = x.Prop)生成的nullexception?
AFAIK你需要使用可空的枚举来实现这一目标。 它也有意义,因为当未选择值( --SELECT--
)时,枚举必须为空。 这是一篇关于有用的扩展方法的好文章 。
- BeautifulSoup和ASP.NET/C#
- 为什么我得到System.UnauthorizedAccessException拒绝访问路径’Google.Apis.Auth’被拒绝
- 使用特定名称而不是发件人电子邮件在asp.net中发送电子邮件
- iTextSharp可以打开RTF文档,对其进行操作,并将文档导出为PDF吗?
- 即时通知,如Facebook
- 将linq sql结果放入分层结构,以便在无序列表中使用(对于jquery树)
- 文件名和哑剧问题 – ASP.NET下载文件(C#)
- 如何在打开子报表时阻止crystal report viewer查询登录凭据
- 从ASP.NET中的Seek位置流式传输MP4video