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 } );
}
@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;
}
6条答案
按热度按时间ujv3wf0j1#
通常你会收到一个模型作为参数。您必须有Map到模型属性的表单字段。
在你看来:
然后在与视图对应的动作中发送和接收模型
ni65a41a2#
除了调用控制器的操作之外,您不应该希望将对象从视图传递到控制器。如果你试图传递一个参数给你的控制器动作,你可以添加一个路由值。
例如,这将把值3作为id参数传递到您的操作中(使用路由逻辑)
ukqbszuj3#
你是在实现一种形式吗?你最好的办法是在你的控制器上创建一个新的动作来接收你的对象。你的控制器会有这样一个方法:
或者如果你想让它回复帖子:
然后你的视图会通过一个链接或者一个表单提交来调用你的控制器动作。一个链接的例子:
izkcnapc4#
我的印象是,您声明了处理程序以接受FormCollection类型的参数。可以通过变量的文本进行索引以检索值。注意打字错误--尝试检索不存在的值只会返回空白。
3xiyfsfu5#
基于公认的答案,我的答案不是你想要的,但是基于Google(在写这篇文章的时候),这是对实际从View向Controller传递数据最敏感的SO答案。
如果在
WebViewPage<T>.ViewContext.ViewData
上设置该值,则可以从控制器访问该值。我们使用这种技术在视图中设置电子邮件主题,并将其呈现为HTML电子邮件的主体。(这种方法允许我们将主题的定义与电子邮件的正文放在一起,并从我们实际发送电子邮件的控制器访问此主题。注:1)
AspMvcViewAttribute
是一个Resharper注解,如果不使用Resharper,可以忽略它。2)controller.Render
和SendEmail
是外部方法(关于如何发送电子邮件以及如何从控制器中手动渲染视图到字符串,有很多SO答案。我们的观点是这样的:
.EmailSubject
是这样的:7eumitmz6#
我可能来晚了一点,但我是这样做到的。所有你需要的是提到你的ViewData值作为控制器中的参数。具体操作如下: