1

これが私のシナリオです:(これらはすべて、受け入れられた要件と同じビューで達成する必要があります)

  1. ユーザーは、いくつかの検索条件を入力してユーザーを検索します。
  2. ページには、検索結果と更新リンクが一覧表示されます。
  3. ユーザーが更新リンクの 1 つをクリックすると、データを編集できるフォームが表示されます。
  4. ユーザーは、フォームにバインドされたデータを変更して保存します。

このビューにはビュー モデルを使用しました。ここにあります。

[Serializable]
public class UserAddModel
{
    public UserSearchCriteria UserSearchCriteria { get; set; }

    public UserEntity User { get; set; }

    public List<UserPrincipalDto> SearchResults { get; set; }
}

そして、ここに私のコントローラーがあります:

using System;


namespace x.Web.BackOffice.Controllers
{
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
[Authorize(Roles = "Admin")]
public class UserController : Controller
{
    private readonly IAuthentication _authentication;

    private readonly List<RoleEntity> roles = new Y.Framework.Data.Repository<RoleEntity>().Get(null).ToList();
    private Repository<UserEntity> repository = new Repository<UserEntity>();

    [ImportingConstructor]
    public UserController(IAuthentication authentication)
    {
        this._authentication = authentication;
    }

    public ActionResult Index()
    {
        return View(new UserAddModel());
    }

    [HttpPost]
    public ActionResult GetSearchResults(UserAddModel model)
    {
        if (ModelState.IsValid)
        {
            try
            {
                List<UserPrincipalDto> results = 
                    _authentication.SearchUsers(
                        ConfigurationManager.AppSettings["DomainName"],
                        model.UserSearchCriteria.FirstName,
                        model.UserSearchCriteria.LastName,
                        model.UserSearchCriteria.Username);

                model.SearchResults = results;

                Session["UserAddModel"] = model;

                return View("Index", model);
            }
            catch (Exception ex)
            {
                Logger.Log(ex, User.Identity.Name);
            }
        }
        else
        {
            ModelState.AddModelError("", "Error!");
        }

        Session["UserAddModel"] = model;

        return View("Index", model);
    }

    public ActionResult Save(string username)
    {
        UserAddModel model = Session["UserAddModel"] as UserAddModel;

        UserEntity exists = repository.Get(u => u.Username == username).FirstOrDefault();

        if (exists == null) 
        {
            UserPrincipal userPrincipal =
            _authentication.GetUserDetails(
                ConfigurationManager.AppSettings["DomainName"],
                username);

            model.User = new UserEntity();
            model.User.Id = userPrincipal.Guid.Value;
            model.User.FirstName = userPrincipal.DisplayName.FullNameToFirstName();
            model.User.LastName = userPrincipal.DisplayName.FullNameToLastName();
            model.User.Email = userPrincipal.EmailAddress;
            model.User.Username = userPrincipal.SamAccountName;    
        }
        else
        {
            model.User = new UserEntity();
            model.User.Id = exists.Id;
            model.User.FirstName = exists.FirstName;
            model.User.LastName = exists.LastName;
            model.User.Email = exists.Email;
            model.User.Username = exists.Username;
            model.User.RoleId = exists.RoleId;
        }

        ViewBag.Roles = roles;

        return View("Index", model);
    }

    [HttpPost]
    public ActionResult Save(UserAddModel model)
    {
        UserEntity exists = repository.Get(u => u.Id == model.User.Id).FirstOrDefault();

        if (exists == null) 
        {
            Result result = repository.Save(model.User);    

            HandleResult(result, model);
        }
        else 
        {
            Result result = repository.Save(model.User, PageMode.Edit);

            HandleResult(result, model);
        }

        ViewBag.Roles = roles;

        return View("Index", model);
    }
}
}

ご覧のとおり、ビューには 2 つの異なるフォームがあり、ビュー モデル全体をコントローラーのセッションに格納しています。しかし、これでは十分ではないと思います。セッションの有効期限が切れた場合、またはロード バランサーを使用してアプリケーションをデプロイする必要がある場合はどうすればよいですか?

この種のページを開発する最善の方法は何ですか? 私はあらゆる種類の提案を受け入れます。

前もって感謝します、

4

0 に答える 0