0

我有一种情况,我希望“添加”视图接受来自控制器的 int,但向 HttpPost 控制器方法返回不同的类型。令人困惑,我知道。“添加”视图用于创建类型为 Widget 的对象,但我需要传入 WidgetCategory 的 ID。所以在我的 WidgetController 中,我会有一个类似的方法:

public ActionResult Add(int id) // 'id' is the WidgetCategoryID
{
    return View(id);
}

但是,在视图中,由于它打算返回要添加的 Widget,因此将像这样开始:

@using MyProject.Models
@model Widget
@{
    ViewBag.Title = "My Title";
    Layout = "~/Views/Shared/_MyLayout.cshtml";
}
@using (Html.BeginForm())
{
    // Insert markup here ...
}

我的问题是,如果输入 WidgetCategoryID 以返回 Widget,我该如何将其传递给控制器​​?我希望将其添加为表单中的隐藏字段,如下所示:

@Html.Hidden(id)

任何想法将不胜感激。

谢谢!

4

4 回答 4

2

假设你的 ViewModelWidget有一个WidgetCategoryId属性

public class Widget
{
  public int ID  { set;get;}
  public int WidgetCategoryId { set;get;}
  //Other properties
}

将其发送到Add视图(HttpGet)

public ActionResult Add(int id)
{
  Widget objModel=new Widget{ WidgetCategoryId =id} ;
  return View(objModel);
}

现在在您的视图中,使用HTML 帮助器方法Add将其保存在隐藏变量中。HiddenFor

@using MyProject.Models
@model Widget
@{
    ViewBag.Title = "My Title";   
}
@using (Html.BeginForm())
{
    @Html.HiddenFor(m=>m.WidgetCategoryId);
    <input type="submit" value="Save" />
}

现在,HTTPPost当您提交时,您将在您的操作方法中拥有它。

[HttpPost]
public ActionResult Add(Widget model)
{
  //  check model.WidgetCategoryId and Have fun with it
}
于 2012-05-22T14:49:13.200 回答
1

默认模型绑定器按名称检查请求参数并尝试根据模型设置属性。如果你需要更进化的东西,你可以看看自定义模型绑定。顺便说一句,您可以将操作更改为:

public ActionResult Add(Widget widget) // Widget class has one property named Id with public set
{
    return View(widget);
}

或者

public ActionResult Add(int id) // 'id' is the WidgetCategoryID
{
    Widget widget = new Widget();
    widget.Id = id;
    return View(widget);
}

我稍微喜欢第二种形式的创作,但我想这是一个品味问题

顺便说一句,您的视图表单应为 Widget 对象的每个“重要”属性提供输入。(隐藏或文本)通过:

@Html.HiddenFor (m => m.Id);
于 2012-05-22T14:39:10.510 回答
1

在您的视图代码中,您不仅要指定视图将返回一个Widget类型,还要指定该视图的整个模型是一个Widget类型。基本上,通过它传入传出View 的数据@model是 type Widget

您可以在这里做的是将 View 的强类型保留为 a Widget,但是您只需传入一个 ID 值(a simple int),您可以使用 theViewData或 theViewBag

例如,在控制器中:

public ActionResult Add(int id) // 'id' is the WidgetCategoryID
{
    // All properties of a ViewBag are completely dynamic!
    ViewBag.WidgetID = id;

    // You're still returning a View strongly-typed to a Widget, but not 
    // actually supplying a Widget instance.
    return View();
}

在视图中:

@using MyProject.Models
@model Widget
@{
    ViewBag.Title = "My Title";
    Layout = "~/Views/Shared/_MyLayout.cshtml";
}
@using (Html.BeginForm())
{
    // Retrieve the WidgetID from the ViewBag
    var WidgetID = ViewBag.WidgetID;

    // Do something with the WidgetID, for example:
    @Html.Hidden(WidgetID)
}

注意ViewDataViewBag非常相似的机制,通过它可以将“非模型”数据传递到视图中。ViewBag 是较新的(MVC 3)并且基于dynamicC#4.0 的特性,而 ViewData 是基于键/值对集合的旧方法。

于 2012-05-22T15:04:13.427 回答
0

在 Controller 中的 Add Action 中,您可以将 ViewBag 属性设置为 id,并在 View 中使用 ViewBag 属性执行 html.Hidden() 。IE,

public ActionResult Add(int id) // 'id' is the WidgetCategoryID 
{     
   Widget widget = new Widget();     
   widget.Id = id;     
   ViewBag.categoryId = id;
   return View(widget); 
}

在视图中

@Html.Hidden(@:ViewBag.categoryId)
于 2012-05-22T14:44:05.167 回答