如何通过视图将路径中的数字传递给我的控制器
我称之为
之类的路线(本地主机)/ MyThing /创建/ 3
我想要做的是使用该3参数,并在将其插入数据库时将其设置在MyThing对象中。
我创建了一个强烈输入的编辑视图。因此,默认情况下,视图会询问用户此值(但我不想这样做)。
我在控制器中有这些方法
public ActionResult Create()
{
var thing= new MyThing();
return View(thing);
}
和
[HttpPost]
public ActionResult Create(MyThing newThing, int thingID)
{
if (ModelState.IsValid)
{
try
{
newThing.ThingID= thingID;
DB.MyThing .AddObject(newThing);
DB.SaveChanges();
return RedirectToAction("Index");
}
catch (Exception ex)
{
ModelState.AddModelError("", "Error creating new Thing");
}
}
return View(newThing);
}
我尝试在视图中注释掉thingID代码但是我得到一个错误,它不能为null。我也尝试在这里更改第一个方法来获取参数并在新建对象时设置它,但路线确实有效。
如果我在默认视图中使用上面的代码,则该数字是可编辑的,并且在屏幕上为零。当你回到控制器时,param会重置为0。
理想的是视图获取此值(在我的示例中为3)并显示它但是只读。我该怎么做?
如果重要的话,我正在使用ASP.net 2.
答案 0 :(得分:1)
你的帖子操作有问题,因为它有两次thingId参数:一次作为MyThing
对象的属性,一次作为一个单独的参数,意味着以下行无用作为默认模型绑定器将已分配属性:
newThing.ThingID = thingID;
现在就您的视图而言,您没有显示它,但您可以将此id参数作为表单的一部分或作为隐藏字段包含在内。
例如:
<% using (Html.BeginForm(new { thingID = ViewContext.RouteData.Values["thingID"] })) { %>
...
<% } %>
如果您想将其作为只读文本框包含在内:
<% using (Html.BeginForm()) { %>
<%= Html.TextBoxFor(x => x.ThingId, new { @readonly = "readonly" }) %>
...
<% } %>
最后你的邮政行动将成为:
[HttpPost]
public ActionResult Create(MyThing newThing)
{
if (ModelState.IsValid)
{
try
{
DB.MyThing.AddObject(newThing);
DB.SaveChanges();
return RedirectToAction("Index");
}
catch (Exception ex)
{
ModelState.AddModelError("", "Error creating new Thing");
}
}
return View(newThing);
}
答案 1 :(得分:1)
我认为您可以正确设置路线,并在您通话时通过
(localhost)/MyThing/Create/3
因此,在您的Global.asax
或区域路线注册文件中,您需要执行以下操作:
context.MapRoute("thing_route",
"MyThing/Create/{thingID}",
new
{
controller = "MyThing",
action = "Create"
}
);