MVC3 ::创建一个视图来处理多种类型

时间:2012-05-22 14:32:05

标签: asp.net-mvc-3 c#-4.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,我如何将WidgetCategoryID传递给控制器​​?我希望将它作为隐藏字段添加到表单中,如下所示:

@Html.Hidden(id)

非常感谢任何想法。

谢谢!

4 个答案:

答案 0 :(得分:2)

假设您的ViewModel Widget具有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);
}

现在在Add视图中,使用HiddenFor HTML帮助程序方法将其保存在hiddden变量中。

@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
}

答案 1 :(得分: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);

答案 2 :(得分:1)

在您的视图代码中,您不仅要指定视图返回 Widget类型,还要指定该视图的整个模型为Widget类型。基本上,该数据通过@model Widget传递 视图的类型为Widget

您可以在此处执行的操作是将视图的强类型保留为int,但只需传入ID值(简单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(); } ),即可使用ViewDataViewBag

例如,在控制器中:

@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)
}

在视图中:

ViewData

请注意,ViewBag和{{1}}是very similar mechanisms,“非模型”数据可以通过这些数据传递到视图中。 ViewBag更新(MVC 3)并且基于C#4.0的dynamic功能,而ViewData是基于键/值对集合的旧方法。

答案 3 :(得分:0)

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

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)