ASP.NET MVC ModelBinder错误:将请求变量“id”绑定到Model的属性“Id”

时间:2011-03-18 23:47:44

标签: asp.net-mvc model-binding defaultmodelbinder

我正在使用MVC 3最终RTM。

鉴于

这条路线:

context.MapRoute(
    "Blog_Posts",
    "Blog/Posts/{id}/{slug}",
    new { controller = "Posts", action = "Index", slug = UrlParameter.Optional }
);

在帖子的页面上,例如/ blog / posts / 2 / some-slug我使用Comment模型绑定部分视图:

@Html.Partial("_CommentEditor", new Comment())

Comment有一个public int Id {get; set;}

在局部视图中,我有这个:

@Html.HiddenFor(comment => comment.Id)

为什么会显示这个?

<input type="hidden" value="2" name="Id" id="Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">

为什么当我将Id上的Comment更改为CommentId时,为什么它的值正确为0

我认为默认的模型绑定器绑定到路由的{id}

4 个答案:

答案 0 :(得分:2)

发生这种情况是因为当您使用HiddenFor等HTML帮助程序时,它们首先会查看路径数据和模型状态,然后再查看模型中的状态。因此,他们在您的路径数据中找到参数id = 2,并在您传递的模型中使用此值而不是id = 0。

答案 1 :(得分:1)

这是一个错误,也可能不是因为以下实现的逻辑;

在Asp.NET MVC中,View引擎使用 ViewData (它是变量,其类型是“ViewDataDictionary”)。此 ViewData 有2个属性“ModelState”,用于保存路由值,“Model”用于保存我们的实际模型对象。

  1. View引擎查看“ModelState”对象检索属性的值。
  2. 如果在步骤1中找到,则返回值。
  3. Else查看“Model”对象以检索属性的值。
  4. 在上面的例子中,route有属性“id”,它的值保存在“ModelState”中,所以它从“ModelState”而不是绑定模型返回值。

    对于上述情况,任何输入控件都会呈现意外值。

    决议是:

    <div class="postData" value='@Model.Id'/>
    
    //use below jquery function to retrieve data
    var postedData = $('.postData');
    

答案 2 :(得分:0)

如果您使用linq to sql,则无法手动设置标记为数据库提供的字段。

答案 3 :(得分:0)

尝试:

Try @Html.Partial("_CommentEditor", new Comment{Id = 0})