我正在使用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}
。
答案 0 :(得分:2)
发生这种情况是因为当您使用HiddenFor等HTML帮助程序时,它们首先会查看路径数据和模型状态,然后再查看模型中的状态。因此,他们在您的路径数据中找到参数id = 2,并在您传递的模型中使用此值而不是id = 0。
答案 1 :(得分:1)
这是一个错误,也可能不是因为以下实现的逻辑;
在Asp.NET MVC中,View引擎使用 ViewData (它是变量,其类型是“ViewDataDictionary”)。此 ViewData 有2个属性“ModelState”,用于保存路由值,“Model”用于保存我们的实际模型对象。
在上面的例子中,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})