1

我有一个父子情况,例如我的用户类和我的用户工作子类(实体框架脚手架类)。我使用控制器向导来搭建 CRUD 方法和视图。它构建了两个 Create 方法,Get 和 httpPost 方法。

在正常情况下,我希望将用户的 id 传递到 get 中,以便将其传递到 html.beginform() 部分中填充的模型中,然后将其传递到 post 中。

我不确定这样做的正确方法是什么?我已经修改了 Get 如下

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 值,这是实现此目的的正确方法吗?

干杯蒂姆

4

4 回答 4

1

可以在 ViewData 中传递 Id,但我会改用 ViewBag,因为您使用的是 MVC3。它基本上是 ViewData 的基于动态的包装器,无需进行强制转换

控制器:

this.ViewBag.UserId = userId;

ViewBag.UserId然后,您可以像在视图中一样访问 ViewBag 属性

于 2012-05-25T05:48:13.243 回答
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。在这种情况下,您可以使用路线数据或隐藏字段。

于 2012-05-25T05:59:26.473 回答
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 字段中。

干杯蒂姆

于 2012-05-25T07:56:31.963 回答
1

我在父->子关系方面遇到了同样类型的问题。但我通过创建以下路线解决了这个问题:

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 的示例 url-

(siteurl)/Users/1/UserWork/list
(siteurl)/Users/1/UserWork/New
(siteurl)/Users/1/UserWork/Edit/1

等等……

使用这条路线很容易从一个动作导航到另一个动作,因为您不需要在重定向时一次又一次地传递 user_id。并在 URL 中提供有关您正在导航的内容的清晰图片。

于 2012-05-25T10:13:49.787 回答