我的MVC 3项目中的模型有一个强类型的剃刀视图。基本上它用于编辑模型。
该模型包含数据库键和其他一些字符串字段的Id字段(它是一个viewModel,但不是问题的所有部分)。
在视图中,我只有一个表单和一个提交按钮,没有别的。当视图发布到控制器时,控制器中的模型将所有字段都清空,除了Id字段似乎已经自动填充了。
在视图中没有相应的“input”元素的情况下,Id字段如何以及在何处填充模型。
这可能是一个愚蠢的问题,但我很感激,甚至只是我应该阅读的链接。感谢。
答案 0 :(得分: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()
助手在生成action属性时使用当前url,并且由于当前url为/home/index/123
,因此使用它。
因为如果您在Global.asax中保留了默认路由,则在URL的末尾使用{id}
路由令牌,默认模型绑定器会成功将其绑定到Id
属性您的视图模型。
答案 1 :(得分:1)
您可能正在点击类似于以下内容的URL:/ MyObject / Edit / 15
然后返回您有空白表单的页面。
接下来会发生一个HTML.BeginForm(),它发布回到/ MyObject / Edit / 15
现在由于邮寄回来的格式相同,您的路由规则会获取'15'并将其绑定回您的ID。
答案 2 :(得分:0)
您是否已将ID字段添加为隐藏字段?
e.g。 @ Html.HiddenFor(x =&gt; x.ID)