【问题标题】:Parameter for action always not null动作参数始终不为空
【发布时间】:2011-06-17 11:11:01
【问题描述】:

代码如下:

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; }
}

问题是,当我导航到/Messages/Compose(没有查询字符串,没有表单参数)时,我希望该参数为空,这样就不会发生验证错误,但它是一个包含所有字段的实际对象/properties 设置为默认值。

这是不可取的,因为它会导致模型验证被执行,而它不应该是因为尚未输入任何内容!

没有为这个类设置自定义的ModelBinder,默认的ModelBinder也没有改变。

WTF?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-2 .net-3.5


    【解决方案1】:

    真正的答案:PEBKAC。我最初有一个 Send 操作,如果验证失败,我认为出于某种原因我必须重定向到 Compose 操作,而不是仅使用适当的 ViewModel 返回适当的视图。呜呜呜。 :)

    【讨论】:

      【解决方案2】:

      这不是你的代码在做什么——用默认值创建一个对象吗?

         if (composeMessageViewModel == null)
         {
              composeMessageViewModel = new ComposeMessageViewModel();
         }
      

      【讨论】:

      • 我很抱歉,我应该澄清一下。该代码分支永远不会执行,因为此时composeMessageViewModel 永远不会为空。它需要从 DefaultModelBinder 返回 null 以便不检查模型验证。
      • 明白了。实际上我认为这就是 Model Binder 所做的。
      • 我不确定您是不是在尝试做一些不寻常的事情?通常你会分离出另一种方法,一个不带参数并使用 [AcceptVerbs(HttpVerbs.Get)] 的方法,并用 [AcceptVerbs(HttpVerbs.Post)] 装饰现有方法?
      • 是的。我阅读了 DefaultModelBinder 的源代码,它确实按预期工作。正如我在自我回答中指出的那样,我试图做一些完全没有必要的愚蠢的事情。不过,我会支持你让我走上正轨!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      相关资源
      最近更新 更多