繁体   English   中英

ASP.NET MVC2:视图,视图模型和发布请求

[英]ASP.NET MVC2: Views, Viewmodels, and Post requests

在ASP.NET MVC2中遵循良好的面向对象设计时,我遇到了麻烦,我认为问题在于对用户将要发布信息时ViewModels和Views应该如何交互的理解不足。

我实现了一个论坛,该论坛允许用户使用Reply操作创建对线程的回复。 我的ReplyViewModel包含一个用于threadId的int和一个用于答复内容的字符串。 Reply操作将创建一个带有ThreadId的ReplyViewModel,以便我们知道用户正在答复哪个线程。 回复视图的类型是ReplyViewModel的强类型,并具有允许用户编辑模型内容的表单。 然后,用户可以将threadId作为参数发布到Reply操作。

它有效,但是我认为我做的方法不正确。 每篇文章都涉及两个ReplyViewModels:一个包含threadId但内容为空,另一个包含内容但ThreadId为空。 Reply View正在创建一个新的ReplyViewModel,我认为它应该只是编辑传递给该视图的ReplyViewModel,但是我不知道如何。

这是该视图的简化版本:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<mvcForum.ViewModels.ReplyViewModel>" %>
<%: Html.TextAreaFor(model=> model.content, new{TextMode="multiline", id="postbox"})%>
<input type="submit" value="Reply" />

如果这还不足以回答我的问题,请使用以下完整视图: http : //pastebin.com/BFGL4p67

ViewModel实际上只是一个字符串(内容)和一个int(线程ID)。

控制器:

[Authorize]
public ActionResult Reply(int id)
{
    ReplyViewModel reply = new ReplyViewModel
    {
        ThreadId = id
    };
    return View(reply);
}
[HttpPost]
public ActionResult Reply(int id, ReplyViewModel model)
{
    /**TODO: Catch when no user*/
    var newPost = new ForumPost
    {
        UserId = (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey,
        ThreadId = id,
        postContent = model.content
    };
    db.AddToForumPosts(newPost);
    db.SaveChanges();
    return RedirectToAction("Index");
}

所以我的问题是“执行我想做的最好的方法是什么?我可以使用ReplyViewModel的单个实例从控制器传递到视图,再传递回控制器吗?”

我觉得你在做什么很好。

您正在考虑尚未遇到的问题,即填充表单的数据与将要发布的数据有很大不同时 这里的“获取”视图模型是“发布”视图模型的子集,因此可以使用一个视图模型,但是如果“获取”的数据与“发布”的数据相差很大,则可以使用两个不同的视图模型,例如:

public class GetReplyFromViewModel  //...
public class PostReplyFromViewModel //...

但是我建议不要这样做,除非两个视图模型都非常不同并且足够复杂以要求他们自己的视图模型。

需要记住的重要一件事: 仅仅因为视图被强类型化为类型“ A”,并不意味着post方法中的参数类型不能为类型“ B”。

  • 无论何时创建视图,视图的类型将仅确定视图中的编译/智能以及视图的类型检查。
  • post方法参数的类型将仅使用MVC模型绑定将发布的HTTP表单转换为您指定的类型。

换句话说,您的视图类型可能只是

<%@ Page Title="" ... Inherits="System.Web.Mvc.ViewPage<int>" %> 

如果您愿意,则整个Model变量只是ThreadId ,而如果您的html字段命名正确,则post方法仍可以使用相同的参数。

但是同样,在这种情况下,我认为当前的实现还可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM