Asp.net mvc 3 将查询字符串值传递到视图模型

Asp.net mvc 3 将查询字符串值传递到视图模型,asp.net-mvc-3,razor,asp.net-mvc-routing,Asp.net Mvc 3,Razor,Asp.net Mvc Routing,我有一个父子情况,例如我的用户类和我的用户工作子类(实体框架脚手架类)。我使用控制器向导构建CRUD方法和视图。它构建了两个Create方法,Get和httpPost方法 在正常情况下,我希望将用户id传递到get中,以便将其传递到在html.beginform()节中填充的模型中,然后将其传递到POST中 我不确定这样做的正确方法是什么?我对Get进行了如下修改 public ActionResult Create(int id) { this.ViewData.Add("id",

我有一个父子情况,例如我的用户类和我的用户工作子类(实体框架脚手架类)。我使用控制器向导构建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>
......
@model用户工作
@{
ViewBag.Title=“创建”;
int id=(int)ViewData[“id”];
}
创造
@使用(Html.BeginForm(routeValue:new{user_id=@id})){
@Html.ValidationSummary(true)
用户工作
@LabelFor(model=>model.user\u id)
@EditorFor(model=>model.user\u id)
@Html.ValidationMessageFor(model=>model.user\u id)
......
(我将搭建好的用户id字段保留为可编辑字段,以便在加载表单时查看它们是否已预填充)表单加载的哪些字段中没有我的id值,这是实现这一点的正确方法吗

干杯
Tim

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

控制器:

this.ViewBag.UserId = userId;

然后,您可以在视图中以
ViewBag.UserId
的形式访问ViewBag属性

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

控制器:

this.ViewBag.UserId = userId;

然后,您可以在视图中以
ViewBag.UserId
的形式访问ViewBag属性

您没有向视图传递任何模型。这对我来说是错误的。您的视图强类型化为
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>
......
@model用户工作
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm(){
@Html.ValidationSummary(true)
用户工作
@LabelFor(model=>model.user\u id)
@EditorFor(model=>model.user\u id)
@Html.ValidationMessageFor(model=>model.user\u id)
......

还请注意,在
Html.BeginForm
中,您不需要重新通过
用户id
,因为表单中有相应的编辑器模板用于此字段。但通常不应该有文本输入字段,以便用户可以修改正在编辑的实体的id。在这种情况下,您可以使用路由数据或隐藏字段。

您没有将任何模型传递给视图。这对我来说是错误的。您的视图是强类型的
用户工作
模型,因此控制器操作通常应该将该模型的实例传递给视图,而不是使用任何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>
......
@model用户工作
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm(){
@Html.ValidationSummary(true)
用户工作
@LabelFor(model=>model.user\u id)
@EditorFor(model=>model.user\u id)
@Html.ValidationMessageFor(model=>model.user\u id)
......

还请注意,在
Html.BeginForm
中,您不需要重新通过
用户id
,因为表单中有相应的编辑器模板用于此字段。但通常不应该有文本输入字段,以便用户可以修改正在编辑的实体的id。在这种情况下,您可以使用路由数据或者一个隐藏字段。

因此,我最初的问题提出了几个关于我对MVC和路由的理解的其他问题。我确定如果我将一个参数作为整数传递给表单中的路由

http://mydomain/controller/myaction/123 
public ActionResult Create(int id)
        {}
 public ActionResult Create(int user_id)
        {}
如果我的行动方法是

http://mydomain/controller/myaction/123 
public ActionResult Create(int id)
        {}
 public ActionResult Create(int user_id)
        {}
一切都很酷,但如果它的形式

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"});
我决定不实例化模型并将其传递到视图中,因为它使用上面的路由将userid正确地传递到模型的user_id字段中

干杯
Tim

因此,我最初的问题提出了几个关于我对MVC和路由的理解的其他问题。我确定,如果我将一个参数作为整数传递给表单中的路由

http://mydomain/controller/myaction/123 
public ActionResult Create(int id)
        {}
 public ActionResult Create(int user_id)
        {}
如果我的行动方法是

http://mydomain/controller/myaction/123 
public ActionResult Create(int id)
        {}
 public ActionResult Create(int user_id)
        {}
一切都很酷,但如果它的形式

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"});
我决定不实例化模型并将其传递到视图中,因为它使用上面的路由将userid正确地传递到模型的user_id字段中

干杯
Tim

我在父->子关系中遇到了相同类型的问题。但我通过创建以下路径解决了它:

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
诸如此类


使用此路由,您可以轻松地从一个操作导航到另一个操作,因为您不需要在重定向时一次又一次地传递用户id。此外,还可以在URL中清楚地显示您正在导航的内容。

我在父->子关系中遇到了相同类型的问题。但我通过创建以下路由解决了此问题:

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
诸如此类

通过此路径,您可以轻松地从一个操作导航到另一个操作,因为