Asp.net mvc 3 将查询字符串值传递到视图模型
我有一个父子情况,例如我的用户类和我的用户工作子类(实体框架脚手架类)。我使用控制器向导构建CRUD方法和视图。它构建了两个Create方法,Get和httpPost方法 在正常情况下,我希望将用户id传递到get中,以便将其传递到在html.beginform()节中填充的模型中,然后将其传递到POST中 我不确定这样做的正确方法是什么?我对Get进行了如下修改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",
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
诸如此类
通过此路径,您可以轻松地从一个操作导航到另一个操作,因为