如何将路径中的数字通过视图传递给控制器

时间:2011-03-05 16:07:59

标签: c# asp.net-mvc asp.net-mvc-2 routing view

如何通过视图将路径中的数字传递给我的控制器

我称之为

之类的路线

(本地主机)/ 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.

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"
            }
        );