2

ASP.NET MVC 3を初めて使用し、いくつかの関係を持つユーザーオブジェクトの編集ビューを作成しようとしています。ユーザー用の基本的な編集ビューがあり、処理する必要のあるリレーションごとにタブで分割されています。

タブ1=ユーザーの編集タブ2=新しいグループアクセスの作成(現在のグループアクセスのリストを含む)など...

編集ビューのViewModelを作成しました。

public class UserViewModel
{
    public User User { get; set; }
    public GroupAccess GroupAccess { get; set; }
    public IEnumerable<GroupAccess> GroupAccessList { get; set; }
}

編集ビュー:

@model Project.ViewModels.UserViewModel

<div class="row">
    <div class="span9">
        <div class="tabbable tabs-left">
            <ul class="nav nav-tabs">
                <li class="active"><a href="#tab1" data-toggle="tab">User Information</a></li>
                <li><a href="#tab3" data-toggle="tab">Group Access</a></li>
            </ul>

            <div class="tab-content">
                <div class="tab-pane active" id="tab1">
                    @{ Html.RenderPartial("User/_CreateEditUser", Model.User); }
                </div>

                <div class="tab-pane" id="tab3">
                    @{ Html.RenderPartial("User/_CreateGroupAccess", Model.GroupAccess); }
                    @{ Html.RenderPartial("User/_ViewGroupAccessByUser", Model.GroupAccessList); }
                </div>
            </div>
        </div>
    </div>

    @{ Html.RenderPartial("_SidebarPartial"); }

</div>

各部分ビューは、それぞれのオブジェクトに対して強く型付けされています。

部分ビューは、アクションを分離するために同じコントローラーUserControllerに投稿します。「正しい」データを保存する場合はすべて正常に機能しますが、何らかのサーバー側エラーが発生した場合は、なんとかして編集ビューに戻る必要があります。UserControllerの「CreateGroupAccess」アクションでサーバー側のエラーを受け取った場合...必要なUserIdパラメーターを使用して編集ビューに戻るにはどうすればよいですか?

私は立ち往生していて、現在の解決策では間違った方向に進んでいると推測しています。

誰かがこのシナリオを最もよく解決する方法について何か考えを持っていますか?

4

1 に答える 1

0

自分自身を BaseController にします:

BaseController

public class BaseController : Controller {
   protected const String ModelStateTempData = "ModelStateTempData";
   protected Boolean PreserveModelState { get; set; }

   protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, System.Web.Routing.RouteValueDictionary routeValues)
    {
        if(PreserveModelState)
          TempData[ModelStateTempData] = ModelState;

        return base.RedirectToAction(actionName, controllerName, routeValues);
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      if (TempData[ModelStateTempData] != null && !ModelState.Equals(TempData[ModelStateTempData]))
            ModelState.Merge((ModelStateDictionary)TempData[ModelStateTempData]);

      base.OnActionExecuting(filterContext);
    }
}

SomeOtherController

public class SomeController : BaseController {
  public ActionResult SomeAction(FormCollection collection) {
    if(ModelState.IsValid) {
      //Do something
      return SomeThingValidHappened();
    }

    //Not Valid
    PreserveModelState = true;
    return RedirectToAction("myAction");
  }
}
于 2012-09-06T15:07:03.020 に答える