2012-03-05 37 views
1

我在我的MVC 3项目中有一个模型的强类型剃刀视图。基本上它用于编辑模型。MVC 3 POST数据和Id字段

模型包含数据库键和一些其他字符串字段(它是一个viewModel和所有的但不是问题的重点)的Id字段。

在视图中我只是有一个表单和提交按钮,没有别的。当视图发布到控制器时,控制器中的模型除了Id字段外,其他所有字段都是空的,这似乎是自动填充的。

Id字段如何在模型中填充,而在视图中没有相应的“输入”元素。

这可能是一个愚蠢的问题,但即使只是一个链接,我应该阅读。谢谢。

回答

4

我敢打赌,它来自url作为路由参数。

例如您有以下控制器:

public class HomeController: Controller 
{ 
    public ActionResult Index(int id) 
    { 
     vqr model = GetModel(id); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     // the model.Id property will be automatically populated here 
     // because the request was POST /home/index/123 
     ... 
    } 
} 

与以下几种观点:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <button type="submit">OK</button> 
} 

现在你导航到GET /home/index/123,你会得到下面的标记:

<form action="/home/index/123" method="post"> 
    <button type="submit">OK</button> 
</form> 

注意表格的action属性?这就是ID的来源。基本上,Html.BeginForm()帮助程序在生成操作属性时使用当前网址,并且由于当前网址为/home/index/123,因此它被使用了。

而且,如果您在Global.asax中保留了默认路由,则在url的末尾会使用{id}路由令牌,默认模型绑定程序会成功将其绑定到您的视图模型的Id属性。

+0

非常感谢。我猜想它来自路线参数,但不知道如何。 – NVM 2012-03-05 12:30:57

1

你可能打类似如下的URL:/为MyObject /编辑/ 15

这然后返回,你有你的空白表单的页面。

接下来发生的事情是你有一个HTML.BeginForm(),这是BACK张贴到/ MyObject来/编辑/ 15

现在,因为该职位的背面具有相同格式的路由规则捡'15 '并将其绑定回您的ID。

0

您是否将ID字段添加为隐藏字段?

例如 @ Html.HiddenFor(x => x.ID)