0

我正在使用 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的值是否正确?CommentCommentId0

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

4

4 回答 4

2

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

于 2011-03-19T09:13:40.413 回答
1

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

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

  1. 视图引擎查看检索属性值的“ModelState”对象。
  2. 如果在步骤 1 中找到,则返回值。
  3. 否则查看“模型”对象以检索属性的值。

在上述情况下,路由具有属性“id”,其值保存在“ModelState”中,因此它从“ModelState”返回值,而不是绑定模型。

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

分辨率为:

<div class="postData" value='@Model.Id'/>

//use below jquery function to retrieve data
var postedData = $('.postData');
于 2011-03-19T09:32:51.780 回答
0

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

于 2011-03-19T00:01:43.047 回答
0

尝试:

Try @Html.Partial("_CommentEditor", new Comment{Id = 0}) 
于 2011-03-19T00:20:58.567 回答