是否有一种简单的方法可以将对象从视图传递给控制器?
我试过了ViewData["newPerson"]
,但这没效果。
Session["newPerson"]
有效,但还有其他方法可以推荐吗?
答案 0 :(得分:3)
通常你会收到一个模型作为参数。您必须具有映射到模型属性的表单字段。
public class PersonViewModel
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
...
}
然后在你看来:
@model PersonViewModel
@using (Html.BeginForm())
{
<div class="editor-label">@Html.LabelFor( model => model.FirstName )</div>
<div class="editor-field">@Html.EditorFor( model => model.FirstName )</div>
<div class="editor-label">@Html.LabelFor( model => model.LastName )</div>
<div class="editor-field">@Html.EditorFor( model => model.LastName )</div>
...
}
然后在与视图对应的动作中发送和接收模型
[HttpGet]
public ActionResult CreatePerson()
{
return View( new Person() );
}
[HttpPost]
public ActionResult CreatePerson( PersonViewModel person )
{
var person = ...create and persist a Person entity based on the view model....
return Redirect("details", new { id = person.id } );
}
答案 1 :(得分:1)
除了调用控制器的操作之外,您不应该希望将视图中的对象传递给控制器。如果您尝试将参数传递给控制器操作,则可以添加路径值。
例如,这会将值3作为id参数传递给您的操作(使用路由逻辑)
@Html.ActionLink("Home", "Details", new { id = 3 });
答案 2 :(得分:0)
我的印象是你声明你的处理程序采用FormCollection类型的参数。可以通过变量的文本对其进行索引以检索值。注意拼写错误 - 尝试检索不存在的值只会返回空白。
答案 3 :(得分:0)
您是否正在实施表单?您最好的选择是在控制器上创建一个新的动作来接收您的对象。你的控制器会有这样的方法:
public ActionResult MyAction(Person person)
{
// your code
}
或者,如果您希望它回复帖子:
[HttpPost]
public ActionResult MyAction(Person person)
{
// your code
}
然后您的视图会通过链接或表单提交来调用您的控制器操作。链接的一个例子:
@Html.ActionLink("MyContoller", "MyAction", newPerson);
答案 4 :(得分:0)
根据接受的答案,我的回答不是你想要的,而是基于Google(在撰写本文时),这是对从实际将数据从视图传递到控制器。
如果您在WebViewPage<T>.ViewContext.ViewData
上设置了值,则可以从控制器访问它。我们正在使用此技术在视图中设置电子邮件主题,我们将其呈现为HTML电子邮件的正文。 (这种方法允许我们将主题的定义与电子邮件正文一起放置,并从我们实际发送电子邮件的控制器访问此主题。)
/// <summary>
/// Sends a system email containing a rendered view.
/// </summary>
public static void SendSystemEmailOfView(this Controller controller, string to, [AspMvcView] string viewName, object model, ViewDataDictionary viewData = null)
{
if (viewData == null)
{
viewData = new ViewDataDictionary();
}
var body = controller.Render(viewName, model, viewData);
object subject;
if (viewData.TryGetValue(WebViewPageExtensions.ViewDataKey_EmailSubject, out subject))
{
subject = subject as string;
}
if (subject == null)
{
subject = DefaultEmailSubject;
}
SendEmail(to, (string)subject, body, isHtml: true);
}
注意:1)AspMvcViewAttribute
是一个Resharper注释,如果不使用Resharper,可以省略它。 2)controller.Render
和SendEmail
是外部方法(关于如何发送电子邮件以及如何从控制器中手动将视图呈现给字符串,有很多SO答案。)
我们的观点如下:
@model MyViewModel
@{
this.EmailSubject("Subject Here");
}
<p>
Dear Web Forms,
</p>
<p>
I'm leaving you for MVC...it's just so much more...DRY.
</p>
并且.EmailSubject
是这样的:
public const string ViewDataKey_EmailSubject = "MyAppName_EmailSubject";
/// <summary>
/// Sets an email subject in <paramref name="page"/>'s <see cref="WebViewPage{T}.ViewBag"/>. Useful for retrieving the subject from controller.
/// </summary>
public static void EmailSubject<T>(this WebViewPage<T> page, string subject)
{
// Must set value on ViewContext's ViewData if we want to access it after view renders; page.ViewData setter copies the ViewDataDictionary.
page.ViewContext.ViewData[ViewDataKey_EmailSubject] = subject;
}