C# 操作的参数始终不为空
代码如下:C# 操作的参数始终不为空,c#,asp.net-mvc,asp.net-mvc-2,.net-3.5,C#,Asp.net Mvc,Asp.net Mvc 2,.net 3.5,代码如下: public class MessagesController { public virtual ActionResult Compose(ComposeMessageViewModel composeMessageViewModel = null) { if (composeMessageViewModel == null) { // never executed as composeMessageViewMo
public class MessagesController
{
public virtual ActionResult Compose(ComposeMessageViewModel composeMessageViewModel = null)
{
if (composeMessageViewModel == null)
{
// never executed as composeMessageViewModel is always not null
composeMessageViewModel = new ComposeMessageViewModel();
}
return View(composeMessageViewModel);
}
}
以及ComposeMessageViewModel的定义
public class ComposeMessageViewModel
{
[DisplayName("To:")]
[NotEmpty] //custom ValidationAttribute
public IEnumerable<MessageRecipientViewModel> Recipients { get; set; }
[DisplayName("Subject:")]
public string Subject { get; set; }
public string Body { get; set; }
}
公共类ComposeMessageViewModel
{
[显示名称(“收件人:”)]
[NotEmpty]//自定义ValidationAttribute
公共IEnumerable收件人{get;set;}
[显示名称(“主题:”)]
公共字符串主题{get;set;}
公共字符串体{get;set;}
}
问题是,当我导航到/Messages/Compose
(没有查询字符串,没有表单参数)时,我希望参数为null,这样就不会发生验证错误,但它是一个实际对象,其所有字段/属性都设置为默认值
这是不可取的,因为它会导致对模型执行验证,而不应该执行验证,因为尚未输入任何内容
此类没有自定义ModelBinder集,默认ModelBinder未更改
WTF?这不是你的代码在做的事情吗?用默认值创建一个对象
if (composeMessageViewModel == null)
{
composeMessageViewModel = new ComposeMessageViewModel();
}
这不是你的代码正在做的吗?用默认值创建一个对象
if (composeMessageViewModel == null)
{
composeMessageViewModel = new ComposeMessageViewModel();
}
真正的答案是:PEBKAC。我最初有一个Send操作,如果验证失败,我认为出于某种原因,我必须重定向到Compose操作,而不是仅仅返回带有适当ViewModel的适当视图。duuuuuuuuh.) 真正的答案是:PEBKAC。我最初有一个Send操作,如果验证失败,我认为出于某种原因,我必须重定向到Compose操作,而不是仅仅返回带有适当ViewModel的适当视图。duuuuuuuuh.) 对不起,我应该澄清一下。该代码分支永远不会执行,因为
composeMessageViewModel
在该点上永远不会为null。它需要从DefaultModelBinder返回null,以便不检查模型验证。明白了。事实上,我认为这就是模型绑定器所做的。我不确定你是否在尝试做一些不寻常的事情?通常,您会分离出另一个方法,一个不带参数且使用[AcceptVerbs(HttpVerbs.Get)]的方法,并用[AcceptVerbs(HttpVerbs.Post)]装饰您现有的方法。我阅读了DefaultModelBinder的源代码,它确实按照预期工作。正如我在自我回答中指出的那样,我试图做一些完全不必要的傻事。我会投票给你,让我走上正轨!对不起,我应该澄清一下。该代码分支永远不会执行,因为composeMessageViewModel
在该点上永远不会为null。它需要从DefaultModelBinder返回null,以便不检查模型验证。明白了。事实上,我认为这就是模型绑定器所做的。我不确定你是否在尝试做一些不寻常的事情?通常,您会分离出另一个方法,一个不带参数且使用[AcceptVerbs(HttpVerbs.Get)]的方法,并用[AcceptVerbs(HttpVerbs.Post)]装饰您现有的方法。我阅读了DefaultModelBinder的源代码,它确实按照预期工作。正如我在自我回答中指出的那样,我试图做一些完全不必要的傻事。我会投票给你,让我走上正轨!