Asp.net 为什么我的验证会在MVC3中的post之前触发get请求?

Asp.net 为什么我的验证会在MVC3中的post之前触发get请求?,asp.net,asp.net-mvc-3,validation,jquery-ui-tabs,asp.net-mvc-partialview,Asp.net,Asp.net Mvc 3,Validation,Jquery Ui Tabs,Asp.net Mvc Partialview,我有一个MVC3视图,允许用户创建两个不同的东西。在父视图中,要执行此操作的表单通过jquery ui选项卡分解,如下所示: <div id="tabs"> <ul> <li><a href="#tabs-1">New Thing 1</a></li> <li><a href="#tabs-2">Different New Thing&l

我有一个MVC3视图,允许用户创建两个不同的东西。在父视图中,要执行此操作的表单通过jquery ui选项卡分解,如下所示:

<div id="tabs">
        <ul>
            <li><a href="#tabs-1">New Thing 1</a></li>
            <li><a href="#tabs-2">Different New Thing</a></li>
        </ul>
    <div id="tabs-1">@Html.Action("CreateNewThing", "NewThingController")</div>
    <div id="tabs-2">@Html.Action("CreateDifferentThing", "DifferentThing")</div>
    <div></div>
</div>

<script type="text/javascript">
    $(function () {
        $("#tabs").tabs();
    });
</script> 
对于输入字段、提交按钮等,这似乎工作得很好:它渲染所有内容并将其发布到正确的控制器操作方法

但是我现在正在连接验证,我遇到了一个问题。

在控制器中,它正在渲染视图,如下所示:

public ActionResult CreateNewThing(NewThingViewModel model)
{

 ... initializing model fields, drop downs etc.

    return PartialView("CreateNewThing", model);
}
我有一个单独的post方法,如下所示:

 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult CreateNewThing(NewThingViewModel newThingViewModel, FormCollection collection)
 {
         .....
 }
示例模型:

    public class NewThingViewModel
    {
        [Required]
        [StringLength(50)]
        [Display(Name = "Display Name:")]
        public string DisplayName { get; set; }     
     }
问题是,当页面第一次出现时,模型中通过DataAnnotation标记为[Required]的字段显示为红色,验证摘要在页面最初显示时显示为无效。也就是说,在用户在初始加载时输入任何内容,甚至在文本框中输入任何内容之前,它就好像已经发布了一样

我知道第一个非post CreateNewThing正在启动,因为我可以在调试器中捕获它,并且我知道第二个在初始加载时不会启动

什么会导致我的验证在Get上启动?

这是因为Html.Action的工作方式以及我正在将部分视图呈现到另一个视图上的事实吗

我在web.config中使用了不引人注目的JavaScriptEnabled和ClientValidationEnabled=true

我找不到其他人遇到过这个问题。其他的例子似乎都很管用,但是我也没有找到一个例子,在jQueryUI选项卡中,视图被分成三个部分

如何修复此问题?
选项: 我是否需要手动操作模型。作为解决方法,是否有效? 使用不同的机制来呈现父视图上的部分视图,而不是Html.Action?
使用一些javascript/jquery捕获验证并停止验证?

您正在传入一个“空”模型(我假设它为您所需的属性设置了默认值),而您应该传入null

时,GET controller操作上没有方法参数。您可以初始化一个空模型并将其传递到视图,但不需要将模型传递到方法中

我要看的是错误是来自服务器还是客户端验证。这就成功了!我从参数中取出模型,并在方法中初始化它。非常感谢。
    public class NewThingViewModel
    {
        [Required]
        [StringLength(50)]
        [Display(Name = "Display Name:")]
        public string DisplayName { get; set; }     
     }