2

現在、研修生として ASP.NET MVC 4 プロジェクトに取り組んでおり、管理パネルを実装しようとしています。目標は、すべてのユーザーをグリッド (MVC.GRID) に表示し、同じページで編集することです。グリッド上のすべてのユーザーを表示することができました。ユーザーが選択されると、グリッドの下に情報が表示され、(ajax/jquery を介して) フォームに配置されます。

問題は、フォームの検証が、グリッドがあるページではなく、新しいページに表示されていることです。そして、私はその理由がわかりません..

以下は私のコードです。

これは、フォームが配置される場所です。

<div id="order-content">
  <p class="muted">
    Select a user to see his or her information
  </p>
</div>

フォーム自体 (部分ビュー "_UserInfo):

@using (Ajax.BeginForm("EditUser", "Admin", FormMethod.Post, 
  new AjaxOptions
  {
    InsertionMode = InsertionMode.Replace,
    HttpMethod = "POST",
    UpdateTargetId = "order-content"
  }))
{
  @Html.Bootstrap().ValidationSummary()
  @Html.Bootstrap().ControlGroup().TextBoxFor(x => x.Id)
  @Html.Bootstrap().ControlGroup().TextBoxFor(x => x.Name)
  @Html.Bootstrap().ControlGroup().TextBoxFor(x => x.Password)
  @Html.Bootstrap().SubmitButton().Text("Opslaan").Style(ButtonStyle.Primary)
}

行が選択されるとユーザー情報を表示する JQuery:

$(function () {
pageGrids.usersGrid.onRowSelect(function (e) {
  $.post("/Admin/GetUser?id=" + e.row.Id, function (data) {
    if (data.Status <= 0) {
      alert(data.Message);
      return;
    }
    $("#order-content").html(data.Content);
  });
});
});

私のアドミンコントローラー:

[HttpPost]
public JsonResult GetUser(int id)
{
  var user = _UserService.Get(id);
  var input = _EditInputMapper.MapToInput(user);
  if (user == null)
    return Json(new { Status = 0, Message = "Not found" });

  return Json(new { Content = RenderPartialViewToString("_UserInfo", input) });
}

[HttpPost]
public ActionResult EditUser(AdminUserEditInput input)
{
  if (ModelState.IsValid)
  {
    // todo: update the user
    return View();
  }
  // This is where it probably goes wrong..
  return PartialView("_UserInfo",input);
}

私のコードの何が問題なのか誰にもわかりますか?

ありがとうございました。

4

2 に答える 2

0

ModelState が有効で View() を返す場合、この完全なビューは注文内容に埋め込まれますか? 私はそうではないと思います。もしそうなら、それは ajax リクエストが送信されていないためです。jquery.unobtrusive-ajax js ファイルが含まれていない可能性があります

于 2013-10-01T12:20:56.240 に答える
0

私はそれが今働いている.. jsonvalidator を使用して。それが良い解決策かどうかはわかりませんが、今のところ仕事をしています..

これは、私のAdminControllerで変更したものです

[HttpPost]
public ActionResult EditUser(AdminUserEditInput input)
{
  int id = (int)TempData["UserID"];

  if (ModelState.IsValid)
  {
    _UserService.ChangeMail(id, input.Mail);
    _UserService.ChangeName(id, input.Firstname, input.Name);

    return new RedirectResult(Url.Action("Users", "Admin") + "#id=" + id);
  }
  else
  {

    return new JsonResult { Data = new { Valid = false, Errors = Validator.CheckModelErrors(ModelState) } };
  }
}

JsonValidatorクラスを追加しました:

  public static class Validator // todo: doesn't belong in the controllers directory ?
  {
    public static List<JsonError> CheckModelErrors(System.Web.Mvc.ModelStateDictionary modelstate)
    {
      List<JsonError> errorlist = new List<JsonError>();
      if (modelstate != null && modelstate.Values != null)
      {
        foreach (var m in modelstate.Values)
        {
          if (m.Errors != null)
          {
            foreach (var e in m.Errors)
            {
              errorlist.Add(new JsonError() { ErrorMessage = e.ErrorMessage ?? "" });
            }
          }
        }
      }
      return errorlist;
    }
  }

そしてJsonErrorクラス..

  public class JsonError // todo: doesn't belong in the controllers directory ?
  {
    public string ErrorMessage { get; set; }
    public bool HasError { get; set; }
    public bool CanPerform { get; set; }
  }

最後になりましたが、js:

$(document).on('submit', '#UserForm', function (e) {
    e.defaultPrevented();
    $('#UserForm').validate();
    $.post($(this).attr("action"), $(this).serialize(), function (json) {
      if (json.Valid) {
        $("#order-content").html('<p class="muted"> Select a user.</p>');
      }
      else {
        $("#ShowValidation").empty();
        var list = $("#ShowValidation").append('<ul></ul>').find('ul');
        $.each(json.Errors, function (index, optionData) {
          list.append('<li>' + optionData.ErrorMessage + '</li>');
        })
      }
    }, "json");
  });

これは一時的なものであるため、これを管理する別の方法を考えていました.入力を検証メッセージとともにセッションに保存し、js にそれを _UserInfo ビューに入れることをお勧めしますか?

于 2013-10-16T14:46:39.957 に答える