2011-02-09 96 views
7

我一直在研究这个MVC 3 Razor应用程序,并且通常利用视图模型来实现我的视图。MVC控制器操作 - 处理POST和GET无重复代码

我的视图模型的相当数量包含更多的信息,而不仅仅是我在表单中与我交互的特定实体。因此,我的GET操作处理程序将初始化视图模型并为每个属性提供预期值等。

在我的POST动作处理程序中,检查模型状态是否有效,如果没有,我重新显示窗体/视图错误。

在我的POST动作处理程序中,我发现自己必须从我的GET动作处理程序复制代码才能重新呈现视图。我如何实现我的控制器操作,以便我不必复制负责收集视图模型数据的代码?

我已经尝试允许我的动作处理程序来处理POST和GET,但后来我有输入参数来处理。我的POST动作处理程序将视图模型作为输入参数,但GET动作处理程序不会。

+1

您能否提供一些您正在编写的代码示例? – marcind 2011-02-09 01:42:35

+1

您是否尝试过重定向后操作以获取操作? – frennky 2011-02-09 06:51:59

回答

4

在这样的情况下,我们为视图模型创建了构建器。

看看this post下的选项3。

-1

您的POST操作方法应该能够将viewmodel类型作为参数,而不是所有单独的数据片段。如果视图模型的构建更加复杂,则可能需要为视图模型编写一个模型绑定器,该模型绑定器可以完成更复杂的工作(您的操作方法仍将VM类型作为参数)。

[HttpPost] 
public ViewResult MyAction(MyViewModel model) { 
    // model should now be fully populated; check ModelState.IsValid though in case there are errors (such as the user entering "abc" for an int property) 
} 
7

你的POST处理程序可以从GET处理程序返回的ActionResult,如下所示:

public ActionResult SomePageGet() { 
    var model = new SomePageViewModel(); 

    // Populate ViewModel: 
    ... 

    return View("SomePageGet", model); 
} 

[HttpPost] 
public ActionResult SomePagePost(SomePageViewModel input) { 

    // Validate the model: 
    ... 

    if (!ModelState.IsValid) { 
     // Return the GET page, with error messages: 
     return SomePageGet(); 
    } 

    return View("Success"); 
} 

由于ModelState中包含所有错误消息(和无效的输入),该GET页面将显示他们正常。

0

您可以简单地将通用代码重构为您正在处理的主实体的扩展方法。

然后根据需要多次呼叫,同时入住DRY

我不完全知道这个通用代码的功能是什么,但大多数情况下它将是相关的数据,用于丰富的表示。 在这种情况下,我更喜欢的解决方案是让视图使用RenderAction从另一个动作中加载额外的数据,这些数据可以在以后重构为AJAX页面更新并保留DRY并分离动作的关注点。

0

“......我发现自己不得不复制代码...”

我不明白为什么;为什么你不能简单地在你的控制器中创建一个成员并调用它?并非您的控制器中的所有内容都必须是Action。但你可能想看看建设者,而不是@ataddeini建议。