我有一种情况,我想要一个'添加'视图从控制器接受一个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)
非常感谢任何想法。
谢谢!
答案 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();
}
),即可使用ViewData
或ViewBag
例如,在控制器中:
@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)