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的源代码,它确实按照预期工作。正如我在自我回答中指出的那样,我试图做一些完全不必要的傻事。我会投票给你,让我走上正轨!