Asp.net mvc 4 使用邮政邮件MVC4 Razor移动视图引擎时生成错误
我正在使用邮政邮件发送订单确认。这是一个MVC4项目。代码正在正确发送电子邮件确认 最近,我在项目中添加了MVC mobile。一切正常-除了当用户在移动设备上发送确认电子邮件时。这是订单确认类:Asp.net mvc 4 使用邮政邮件MVC4 Razor移动视图引擎时生成错误,asp.net-mvc-4,email,mobile,razor,postal,Asp.net Mvc 4,Email,Mobile,Razor,Postal,我正在使用邮政邮件发送订单确认。这是一个MVC4项目。代码正在正确发送电子邮件确认 最近,我在项目中添加了MVC mobile。一切正常-除了当用户在移动设备上发送确认电子邮件时。这是订单确认类: public class OrderConfirmation : Postal.Email { public string email { get; set; } public string partyid { get; set; } p
public class OrderConfirmation : Postal.Email
{
public string email { get; set; }
public string partyid { get; set; }
public string GrouponCode { get; set; }
public string originalpartyDate { get; set; }
public string originalpartyStartTime { get; set; }
public string originalpartyTitle { get; set; }
public string originalOrderDate { get; set; }
public bool GrouponWasUpgraded { get; set; }
public decimal GrouponFaceValue { get; set; }
public bool ClassCancelled { get; set; }
public string firstname { get; set; }
public string orderlink { get; set; }
}
然后它被称为这样的:
ci = new Email.OrderConfirmation
{
ClassCancelled = false,
email = Email,
firstname = FirstName,
orderlink = "https://website.com/Checkout/Archive?orderlinkid=" + OrderLinkId,
originalpartyDate = DateStart.ToShortDateString(),
originalpartyStartTime = DateStart.ToShortTimeString(),
originalpartyTitle = odt.Party.Title,
partyid = odt.PartyId.ToString()
};
Task task = ci.SendAsync();
protected void Application_Start()
{
DisplayModeProvider.Instance.Modes.Insert(0, new
DefaultDisplayMode("Tablet")
{
ContextCondition = (ctx =>
ctx.Request.UserAgent.IndexOf("iPad", StringComparison.OrdinalIgnoreCase) >= 0 ||
ctx.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0 &&
ctx.Request.UserAgent.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) < 1)
});
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("iPhone")
{
ContextCondition = (ctx =>
ctx.GetOverriddenBrowser().IsMobileDevice ||
ctx.GetOverriddenUserAgent().IndexOf
("iPhone", StringComparison.OrdinalIgnoreCase) >= 0
)
});
/// omitted the rest of the (standard) code for brevity
}
在我的Global.asax.cs文件中,我检测到移动设备,并插入显示模式,如下所示:
ci = new Email.OrderConfirmation
{
ClassCancelled = false,
email = Email,
firstname = FirstName,
orderlink = "https://website.com/Checkout/Archive?orderlinkid=" + OrderLinkId,
originalpartyDate = DateStart.ToShortDateString(),
originalpartyStartTime = DateStart.ToShortTimeString(),
originalpartyTitle = odt.Party.Title,
partyid = odt.PartyId.ToString()
};
Task task = ci.SendAsync();
protected void Application_Start()
{
DisplayModeProvider.Instance.Modes.Insert(0, new
DefaultDisplayMode("Tablet")
{
ContextCondition = (ctx =>
ctx.Request.UserAgent.IndexOf("iPad", StringComparison.OrdinalIgnoreCase) >= 0 ||
ctx.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0 &&
ctx.Request.UserAgent.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) < 1)
});
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("iPhone")
{
ContextCondition = (ctx =>
ctx.GetOverriddenBrowser().IsMobileDevice ||
ctx.GetOverriddenUserAgent().IndexOf
("iPhone", StringComparison.OrdinalIgnoreCase) >= 0
)
});
/// omitted the rest of the (standard) code for brevity
}
受保护的无效应用程序\u Start()
{
DisplayModeProvider.Instance.Modes.Insert(0,新
默认显示模式(“平板电脑”)
{
ContextCondition=(ctx=>
ctx.Request.UserAgent.IndexOf(“iPad”,StringComparison.OrdinalIgnoreCase)>=0||
ctx.Request.UserAgent.IndexOf(“Android”,StringComparison.OrdinalIgnoreCase)>=0&&
ctx.Request.UserAgent.IndexOf(“mobile”,StringComparison.OrdinalIgnoreCase)<1)
});
DisplayModeProvider.Instance.Modes.Insert(1,新的DefaultDisplayMode(“iPhone”)
{
ContextCondition=(ctx=>
ctx.getOverridedBrowser().IsMobileDevice||
ctx.getOverridedUserAgent().IndexOf
(“iPhone”,StringComparison.OrdinalIgnoreCase)>=0
)
});
///为简洁起见,省略了(标准)代码的其余部分
}
我得到的错误消息是一个通用的“对象引用未设置为对象的实例”
我已经将堆栈跟踪放在下面,以及错误代码生成时间的图像
iisexpress.exe Error: 0 : 4/15/2014 11:09:33 AMSystem.NullReferenceException: Object reference not set to an instance of an object.
at application.MvcApplication.<Application_Start>b__1(HttpContextBase ctx) in c:\Dropbox\SourceCode\PUYF_NonTFS\PUYF_Website\Application\Global.asax.cs:line 132
at System.Web.WebPages.DefaultDisplayMode.CanHandleContext(HttpContextBase httpContext)
at System.Web.WebPages.DisplayModeProvider.<>c__DisplayClass6.<GetAvailableDisplayModesForContext>b__5(IDisplayMode mode)
at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations)
at System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache)
at System.Web.Mvc.ViewEngineCollection.<>c__DisplayClassc.<FindView>b__a(IViewEngine e)
at System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths)
at System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext, String viewName, String masterName)
at Postal.EmailViewRenderer.CreateView(String viewName, ControllerContext controllerContext)
at Postal.EmailViewRenderer.Render(Email email, String viewName)
at Postal.EmailService.CreateMailMessage(Email email)
at Postal.EmailService.SendAsync(Email email)
at Postal.Email.SendAsync()
at Application.Models.Order.SendConfirmation(ArtStoreEntities dbcontext) in
c:\Dropbox\SourceCode\PUYF_NonTFS\PUYF_Website\Application\Models\Order.cs:line 134
iisexpress.exe错误:0:4/15/2014 11:09:33 AMSystem.NullReferenceException:对象引用未设置为对象的实例。
在c:\Dropbox\SourceCode\PUYF\u NonTFS\PUYF\u Website\application\Global.asax.cs中的application.mvcapapplication.b_u1(HttpContextBase ctx)处:第132行
位于System.Web.WebPages.DefaultDisplayMode.CanHandleContext(HttpContextBase httpContext)
在System.Web.WebPages.DisplayModeProvider.c__DisplayClass6.b__5(IDisplayMode)
位于System.Linq.Enumerable.WhereListIterator`1.MoveNext()
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
位于System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext ControllerContext,String[]位置,String[]区域位置,String locationsPropertyName,String name,String controllerName,String cacheKeyPrefix,Boolean useCache,String[]和searchedLocations)
位于System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext ControllerContext、String viewName、String masterName、Boolean useCache)
在System.Web.Mvc.ViewEngineCollection.c__;u显示classc.b__;u a(IViewEngine e)
在System.Web.Mvc.ViewEngineCollection.Find(Func`2查找,布尔跟踪搜索路径)
位于System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext ControllerContext,String viewName,String masterName)
在Postal.EmailViewRenderer.CreateView(字符串viewName,ControllerContext ControllerContext)
在Postal.EmailViewRenderer.Render(电子邮件,字符串viewName)
在Postal.EmailService.CreateMailMessage(电子邮件)
在Postal.EmailService.SendAsync(电子邮件)
在Postal.Email.SendAsync()上
在中的Application.Models.Order.SendConfirmation(ArtStoreEntities dbcontext)处
c:\Dropbox\SourceCode\PUYF\u NonTFS\PUYF\u Website\Application\Models\Order.cs:第134行
看起来,当postal生成视图时,它会点击global.asax文件中的应用程序启动,因为useragent属性为null,所以它会生成错误。我尝试在应用程序启动过程中的特定代码周围放置一个try-catch块,但这不起作用
我需要帮助如何告诉MVC或Postal不要为显示模式而烦恼。有什么建议吗?当
ctx.Request.UserAgent
为空时,您能尝试使ContextCondition
返回false吗?这就是我最后要做的:
DisplayModeProvider.Instance.Modes.Insert(0, new
DefaultDisplayMode("Tablet"){
ContextCondition = (ctx =>
ctx.Request.UserAgent != null &&
(
ctx.Request.UserAgent.IndexOf("iPad", StringComparison.OrdinalIgnoreCase) >= 0 ||
ctx.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0 &&
ctx.Request.UserAgent.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) < 1))
});
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("iPhone"){
ContextCondition = (ctx =>
ctx.Request.UserAgent != null &&
(
ctx.GetOverriddenBrowser().IsMobileDevice ||
ctx.GetOverriddenUserAgent().IndexOf
("iPhone", StringComparison.OrdinalIgnoreCase) >= 0
)
)
});
DisplayModeProvider.Instance.Modes.Insert(0,新)
默认显示模式(“平板电脑”){
ContextCondition=(ctx=>
ctx.Request.UserAgent!=null&&
(
ctx.Request.UserAgent.IndexOf(“iPad”,StringComparison.OrdinalIgnoreCase)>=0||
ctx.Request.UserAgent.IndexOf(“Android”,StringComparison.OrdinalIgnoreCase)>=0&&
ctx.Request.UserAgent.IndexOf(“mobile”,StringComparison.OrdinalIgnoreCase)<1))
});
DisplayModeProvider.Instance.Modes.Insert(1,新的DefaultDisplayMode(“iPhone”){
ContextCondition=(ctx=>
ctx.Request.UserAgent!=null&&
(
ctx.getOverridedBrowser().IsMobileDevice||
ctx.getOverridedUserAgent().IndexOf
(“iPhone”,StringComparison.OrdinalIgnoreCase)>=0
)
)
});