我有一个详细信息页面,其中包含名为UserId的表单字段。在同一页面上,我有另一个搜索表单,其中包含一个名为UserId的字段。
我在两个不同的视图模型上使用Html.LabelFor(vm> vm.UserId)和Html.TextBoxFor(sm> sm.UserId),vm是视图模型,sm是搜索模型。 (是的,两个模型上的UserId属性具有相同的名称 - 因为它们是相同的域属性。
当我导航到该页面时,vm上填充的UserId被插入MVC的名为UserId的BOTH表单字段中。甚至sm.UserId都是空的。
这是我最初的问题。有几种方法可以避免这种情况。我的解决方案是使用sm的前缀标志。
[HttpGet]
public ActionResult Search([Bind(Prefix = "Search")] SearchFormViewModel searchFormViewModel, PagingViewModel pagingViewModel)
{
这将激发MVC在搜索表单中的fieldname上呈现Search.UserId,但代码中的属性仍将命名为UserId。
这个解决方案看起来效果很好!
BUT: 现在我必须在Global.asax的路线上解决search.UserId。 我按照这样的方式绘制路线:
routes.MapRoute(
"MyRouteName",
"ControllerName/User/{Search.UserId}",
new { controller = "ControllerName", action = "Search" }
);
我的问题是MVC无法映射Search.UserId(因为。)以适合上面显示的操作中的UserId(带有搜索前缀)。
因此看起来MVC有一个前缀功能,它实际上是通过Route-handler完全支持的。
当然我可以将Search.UserId重命名为Search_UserId,但是名称dosent与MVC在上述接收操作中所期望的名称相匹配。 (期望Search.UserId)重命名搜索模型的UserId属性可以解决问题,但由于它在域中的值相同,这似乎是一种解决方法。
我是否遗漏了有关前缀功能使用的内容,或者这是不可能的?
答案 0 :(得分:0)
所以......我一直在思考这个问题。 - 我的一位同事突然向我展示了光明。
问题在于MVC将对象映射到路由字典。
<a href="<%: Url.RouteUrl("MyRouteName", new { Search.UserId = Model.UserId } ) %>" target="_blank">See the user</a>
wount工作。因为MVC无法处理对象名中的。(点)。
但由于对象名称只是routevaluedictionary中的一个字符串键,因此将其映射到我自己就可以了:
<a href="<%: Url.RouteUrl("MyRouteName", new RouteValueDictionary(new Dictionary<string, object>(){ "Search.UserId", Model.UserId })) %>" target="_blank">See the user</a>