我有一个父子情况,例如我的用户类和我的userwork子类(实体框架脚手架类)。我使用控制器向导来构建CRUD方法和视图。它搭建了两个Create方法,即Get和httpPost方法。
在正常情况下,我希望将用户的id传递给get,以便将其传递到正在html.beginform()部分中填充的模型中,然后将其传递到post中。
我不确定这样做的正确方法是什么?我修改了Get as below
public ActionResult Create(int id)
{
this.ViewData.Add("id", id);
return View();
}
和Create.shtml如下
@model UserWork
@{
ViewBag.Title = "Create";
int id = (int)ViewData["id"];
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
@using (Html.BeginForm(routeValues:new {user_id = @id})) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Userwork</legend>
<div class="editor-label">
@Html.LabelFor(model => model.user_id)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.user_id)
@Html.ValidationMessageFor(model => model.user_id)
</div>
......
(我将脚手架的user_id字段保留为可编辑,因此我可以测试看到它们在表单加载时预先填充)表单加载它在字段中没有我的id值,这是实现此目的的正确方法吗?
干杯 添
答案 0 :(得分:1)
在ViewData中传递Id很好,但我会使用ViewBag,因为你使用的是MVC3。它基本上是一个基于动态的ViewData包装器,可以摆脱对转换的需求
控制器:
this.ViewBag.UserId = userId;
然后,您可以在视图中以ViewBag.UserId
访问ViewBag属性
答案 1 :(得分:1)
您没有将任何模型传递给您的视图。这对我来说是错的。您的视图是UserWork
模型的强类型,因此控制器操作通常应该将该模型的实例传递给视图,而不是使用任何ViewData或ViewBag:
public ActionResult Create(int id)
{
var model = new UserWork();
model.user_id = id;
return View(model);
}
并在视图中:
@model UserWork
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
@using (Html.BeginForm() {
@Html.ValidationSummary(true)
<fieldset>
<legend>Userwork</legend>
<div class="editor-label">
@Html.LabelFor(model => model.user_id)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.user_id)
@Html.ValidationMessageFor(model => model.user_id)
</div>
......
另请注意,在Html.BeginForm
中,您无需重新检查user_id
,因为您在表单内有此字段的相应编辑器模板。但通常不应该有文本输入字段,以便用户可以修改正在编辑的实体的ID。在这种情况下,您可以使用路径数据或隐藏字段。
答案 2 :(得分:1)
所以我的初步问题提出了几个关于我对MVC和路由的理解的问题。我确定如果我将一个参数作为整数传递给路径
http://mydomain/controller/myaction/123
如果我的操作方法是
形式public ActionResult Create(int id)
{}
一切都很酷但如果它的形式
public ActionResult Create(int user_id)
{}
然后我得到一个例外,即没有填充所需的参数user_id。 我添加了一个额外的映射,如下所示,这似乎正确填充了视图。
routes.MapRoute("Create", "{controller}/Create/{user_id}",new {action = "Create"});
我决定不实例化模型并将其传递到视图中,因为使用上面的路径将用户ID正确地传递到模型的user_id字段中。
干杯 添
答案 3 :(得分:1)
我遇到了与parent-&gt;子关系相同类型的问题。但我通过创建以下路线解决了这个问题:
routes.MapRoute(
"route_name",
"Parents/{parent_id}/{controller}/{action}/{id}",
new { action = "list", id = UrlParameter.Optional },
new { parent_id= @"\d+" }
);
在你的情况下,它将成为 -
routes.MapRoute(
"User_Route",
"Users/{user_id}/{controller}/{action}/{id}",
new { action = "list", id = UrlParameter.Optional },
new { user_id= @"\d+" }
);
和UserWorke的示例网址 -
(siteurl)/Users/1/UserWork/list
(siteurl)/Users/1/UserWork/New
(siteurl)/Users/1/UserWork/Edit/1
等等......
使用此路由可以轻松地从一个操作导航到另一个操作,因为您不需要在重定向时反复传递user_id。并在URL中提供有关您正在导航的内容的清晰图片。