2011-05-13 48 views
2

是否有一种简单的方法将对象从我的视图传递到控制器?查看数据从视图到控制器

我试过ViewData [“newPerson”]但没有奏效。

会议[“newPerson”]的作品,但有其他方式更推荐?

+1

从以conttoller?您需要重新考虑当前的应用程序体系结构。 – zerkms 2011-05-13 03:42:10

+0

传入数据到您的控制器通常通过您的操作方法值,它来自路由值或发布的数据。什么阻止你使用它们? – anon 2011-05-13 03:43:40

回答

0

您正在实施表单吗?你最好的选择是在控制器上创建一个新的动作来接受你的对象。您的控制器将有一个这样的方法:

public ActionResult MyAction(Person person) 
{ 
    // your code 
} 

或者,如果你希望它回应的帖子:

[HttpPost] 
public ActionResult MyAction(Person person) 
{ 
    // your code 
} 

那么你的观点会打电话通过链接或表单提交您的控制器动作。一个链接一个例子:基于公认的答案

@Html.ActionLink("MyContoller", "MyAction", newPerson); 
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

你不应该想从传递一个对象模型的在调用控制器的操作之外查看您的控制器。如果您尝试将参数传递给控制器​​操作,则可以添加路由值。

例如,这将通过作为id参数值3到动作(使用路由逻辑)

@Html.ActionLink("Home", "Details", new { id = 3 }); 
0

我的印象是,你宣布你的处理程序采取类型的FormCollection的参数。这可以通过变量的文本索引来检索值。注意拼写错误 - 尝试检索不存在的值只会返回空白。

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.RenderSendEmail是外部方法(有很多关于如何发送电子邮件的答案以及如何从控制器内手动呈现视图到字符串。)

我们的观点是这样的:

@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; 
} 
相关问题