0

至今:

  • 我有一个页面,上面有多个提交,每个提交都取决于前一个。

  • 每次单击提交时都会呈现相同的页面。

  • 我发现自己在控制器方法(基于 ViewModel 的分支)中编写意大利面条代码,并希望将每个提交的行为分解为一​​个单独的方法。

  • 我实施了此处找到的解决方案——特别是 mkozicki 根据 Maartin Balliauw 的文章发布的解决方案。

  • 这对于分叉到不同的控制器方法非常有效。但是我遇到了两个问题:

    1. 每次返回相同的视图。
    2. 在 View.cshtml 中硬连接操作方法名称

这是代码:

控制器:

public class PlayerStatController : Controller
{

    public class PlayerStatViewModel . . . //quite complex ViewModel


    // HTTP GET
    public ActionResult SelectPlayer() 
    {
        List<string> idx_list = getSeasonIndex();
        return View(new PlayerStatViewModel(idx_list));
    }


    // One of three forked action methods
    [HttpPost]
    [MultipleButton(Name = "action", Argument = "ChosenSeason")]
    public ActionResult ChosenSeason(PlayerStatViewModel viewModel) 
    {

        List<string> team_idx = getTeamNameIndex(viewModel.selected_seasonIndex);


        return View("SelectPlayer",new PlayerStatViewModel(new List<string>(), team_idx, new List<string>(), 0));

    }

这里是视图的摘录 (SelectPlayer.cshtml)

<form action="/PlayerStat/ChosenSeason" method="post">
  <fieldset>
    <legend>Select Season</legend>
    <div class="editor-field">
      @Html.LabelFor(m => m.selected_seasonIndex)
      @Html.DropDownListFor(m => m.selected_seasonIndex, Model.seasonIndex_select_list)
      @Html.ValidationMessageFor(m => m.selected_seasonIndex)
    </div>
    <p>
      <input type="submit" value="Choose Season" name="action:ChosenSeason" />
    </p>
  </fieldset>
</form>

因此:

  1. 从分叉操作方法返回是否具有return View("SelectPlayer",new PlayerStatViewModel(...);强制每次呈现相同视图(SelectPlayer.cshtml)的最佳解决方案?
  2. 有没有办法避免在视图中硬编码操作方法名称(即,如果可能的话,<form action="/PlayerStat/ChosenSeason" method="post">我想继续使用)@using (Html.BeginForm())
4

1 回答 1

0
  1. 在 return 语句中指定视图名称是返回与当前正在执行的操作方法不同的视图的最佳和最实用的方法。我相信这是设计使然,以便将操作方法​​与单一视图分离。

  2. 同样,对于视图,如果您希望表单发布到当前 URL 中指定的操作以外的操作,您必须明确指定它。使用空BeginForm()将导致表单发布到上一个请求返回的相同 URL。

我相信您所拥有的是解决问题的最佳方式,也是我实现 MVC 应用程序的方式。显式并没有错,尤其是在视图和视图逻辑方面,因为它们本质上是显式的。将不同的提交按钮分成不同的操作方法是一种可靠的方法,并且本质上需要您指定每个提交按钮的目标操作。您可以认为这种方法类似于用于按钮单击的 Web 窗体服务器端事件处理程序(减去所有讨厌的页面生命周期)。这种方式优雅干净,只执行提交对应的服务器端代码。

于 2013-08-15T13:40:11.203 回答