1

次のようなコントローラーがあります。

public FooController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

インデックス ビューの場合:

@{ Html.RenderPartial("~/Views/Bar/Add", new Models.Bar()); }

バー コントローラは次のようになります。

public BarController : Controller
{
    public ActionResult Add()
    {
        var bar = new Bar();
        return View(bar);
    }

    [HttpPost]
    public ActionResult Add(Bar bar)
    {
        if(ModelState.IsValid)
        {
            _repository.AddBar(bar);
            return RedirectToAction("Index", "Foo");
        }

        // This will return only the partial view (No Layout, no outer view)
        return View("Add", bar);

        // This will not show validation errors
        // return RedirectToAction("Index", "Foo");
    }
}

そして、ビューの追加は次のようになります。

@model Models.Bar

@using(Html.BeginForm("Add", "Bar", FormMethod.Post))
{
    Name: @Html.TextBoxFor(x => x.Name)

    <input type="submit" value="Add Bar" />

    @Html.ValidationSummary()
}

私の問題は、私が戻った場合View("Add", bar)、部分的なビューしか得られず、他には何も得られないことです(私が望むものではありません)。しかし、代わりにRedirectToAction("Index", "Foo")検証に合格したかどうかを返すと、もちろん、検証の概要の検証エラーは失われます。

このような部分ビューで検証を使用する方法はありますか?

4

3 に答える 3

4

あなたは出来る:

  1. return View("~/Views/Home/Index.cshtml")検証が失敗した場合。
  2. ModelState を TempData に保存し、Home.Index アクションで復元します。
  3. AJAX リクエストを作成します。
于 2012-08-18T05:00:42.090 に答える
1

ajax を使用してリクエストを送信する @Html.BeginForm を使用する代わりに、@Ajax.Begin を使用する必要があります。

@model Models.Bar

<div id="targetId">
</div>

        @using(Ajax.BeginForm("Add", "Bar",new AjaxOptions{  HttpMethod ="POST",UpdateTargetId="targetId"}))
        {


            Name: @Html.TextBoxFor(x => x.Name)

            <input type="submit" value="Add Bar" />

            @Html.ValidationSummary()
        }

「追加」とコントローラーでajax呼び出しを行います。

[HttpPost]
public ActionResult Add(Bar bar)
{
    if(ModelState.IsValid)
    {
        _repository.AddBar(bar);
        return RedirectToAction("Index", "Foo");
    }

    return RenderPartialViewToString("Add",bar);
}



protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            return sw.GetStringBuilder().ToString();
        }
    }

次に、「 HtmlRenderString 」を返す「RenderPartialViewToString」メソッドを追加します。ここで、ビューとモデルをパラメーターとしてこのメ​​ソッドに渡す必要があります。また、結果が追加される AjxOption で「 UpdateTargetId 」を指定する必要があります。

于 2012-09-19T14:33:33.220 に答える
0

に置き換え@{ Html.RenderPartial("~/Views/Bar/Add", new Models.Bar()); }て、あなたが持っていた方法で、代わりに@{ Html.RenderPartial("~/Views/Bar/Add"); }新しいものを投稿しようとしたか、ビューを取得しようとしていました。Bar[Post] Add

また、私は通常、コントローラーの部分ビューにPartialViewResultandを使用します。return PartialViewそれが違いを生むかどうかはわかりません。

アップデート

部分的なフォームがあるプロジェクトをプルアップし、使用してアクセスする@Html.Action()と、すべてが機能し、正常に検証されているようです。試してみてください@Html.RenderAction。これは、違いを説明する良い投稿です。http://www.arrangeactassert.com/when-to-use-html-renderpartial-and-html-renderaction-in-asp-net-mvc-razor-views/

于 2012-08-18T05:06:49.517 に答える