将Querystring值传递给View Model

时间:2012-05-25 05:42:07

标签: asp.net-mvc-3 razor asp.net-mvc-routing

我有一个父子情况,例如我的用户类和我的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值,这是实现此目的的正确方法吗?

干杯 添

4 个答案:

答案 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中提供有关您正在导航的内容的清晰图片。