MVC3 - 4 множественных формы с использованием частичных представлений

Итак, я создаю страницу администратора, на которой хочу разместить несколько форм. Итак, я попытался сделать это с помощью Partial View и 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");
    }
}

Проблема связана с HttpPost-версией AddProduct. Если я сохраню его как return View («Индекс»), он попадет в бесконечный цикл. Но если я возвращаю PartialView (данные), он правильно показывает ошибку, но не имеет представления индекса вокруг нее. Таким образом, он показывает только частичный вид. Есть ли способ разместить несколько форм на одной странице и вернуть на страницу проверку на стороне сервера?


person ScubaSteve    schedule 06.12.2012    source источник


Ответы (2)


Хорошо, мне удалось решить эту проблему:

Главная страница указателя администратора:

@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);
    }

Теперь я знаю, что говорил о нескольких формах и показываю здесь только одну форму, но если вы хотите добавить к ней другую форму, просто создайте еще одно частичное представление, другую под-модель представления и добавьте эту под-модель представления в AdminViewModel.

person ScubaSteve    schedule 06.12.2012

Вы пробовали ajax.beginform ()? Назовите div вокруг частичного представления и задайте для UpdateTargetId это имя.

Тогда запрос заменит старый div.

Не забывайте ссылаться на библиотеки сценариев java для ajax!

person Tobias    schedule 06.12.2012
comment
Я бы хотел сделать эту серверную часть. - person ScubaSteve; 06.12.2012
comment
Разве это не серверная? Ajax-Request отправляется вашему контроллеру, который должен быть серверным, а не? - person Tobias; 06.12.2012
comment
Да, он будет проверять через сервер, но если JS отключен, вызов не будет выполнен. - person ScubaSteve; 06.12.2012