2

そこで、複数のフォームを配置したい管理ページを作成しています。そこで、PartialViewとRenderActionを使ってやってみました。

私の管理者インデックスビュー:

@model Rad.ViewModels.AdminViewModel
@{
ViewBag.Title = "Admin";
}

<h2>Admin</h2>

<div>
@{ Html.RenderAction("AddProduct"); }
</div>

私の部分的な見方:

@model Rad.ViewModels.AdminAddProductViewModel

@using (Html.BeginForm("AddProduct", "Admin"))
{
<h1>@Html.LabelFor(model => model.Name)</h1>
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
<input type="submit" value="Add"/>
}

私の管理者コントローラー:

public class AdminController : Controller
{
    //
    // GET: /Admin/
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult AddProduct()
    {
        return PartialView();
    }

    [HttpPost]
    public ActionResult AddProduct(AdminAddProductViewModel data)
    {
        if (ModelState.IsValid)
        {

        }
        return View("Index");
    }
}

問題は、AddProductのHttpPostバージョンにあります。return View( "Index")として保持すると、無限ループに入ります。しかし、PartialView(data)を返すと、エラーが正しく表示されますが、その周りにインデックスビューがありません。したがって、部分ビューのみが表示されます。1つのページに複数のフォームを配置し、サーバー側の検証をページに返す方法はありますか?

4

2 に答える 2

5

わかりました、私はこの問題を解決することができました:

管理者メインインデックスページ:

@model Rad.ViewModels.AdminViewModel
@{
ViewBag.Title = "Admin";
}

<h2>Admin</h2>

<div>
@Html.Partial("AddProduct", Model.AddProduct)
</div>

製品の部分ビューを追加:

@model Rad.ViewModels.AdminAddProductViewModel

@using (Html.BeginForm("AddProduct", "Admin"))
{
<h1>@Html.LabelFor(model => model.Name)</h1>
@Html.TextBoxFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
<input type="submit" value="Add"/>
}

単純なAdminAddProductViewModel:

public class AdminAddProductViewModel
{
    [DisplayName("Add Product:")]
    [Required]
    [StringLength(50)]
    [RegularExpression(@"^[a-zA-Z0-9\s]+$")]
    public string Name { get; set; }
}

AdminViewModelを含む:

public class AdminViewModel
{
    public AdminAddProductViewModel AddProduct { get; set; }

    public AdminViewModel()
    {
        AddProduct = new AdminAddProductViewModel();
    }
}

管理コントローラー:

public ActionResult Index()
    {
        AdminViewModel data = new AdminViewModel();
        return View(data);
    }

    [HttpGet]
    public ActionResult Index(AdminViewModel data)
    {
        return View(data);
    }

    [HttpPost]
    public ActionResult AddProduct(AdminAddProductViewModel data)
    {
        AdminViewModel admin = new AdminViewModel();
        admin.AddProduct = data;
        if (ModelState.IsValid)
        {

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

さて、私は複数のフォームについて話していて、ここでは1つのフォームのみを表示していることを知っていますが、これに別のフォームを追加する場合は、別の部分ビュー、別のサブビューモデルを作成し、そのサブビューモデルをAdminViewModelに追加します。

于 2012-12-06T17:06:19.047 に答える
0

ajax.beginform()を試しましたか?部分ビューの周囲にdivという名前を付け、UpdateTargetIdをその名前に設定します。

次に、クエリは古いdivを置き換えます。

ajaxのjavaスクリプトライブラリを参照することを忘れないでください!

于 2012-12-06T15:45:35.357 に答える