Обновление родительского представления при отправке формы частичного представления - PullRequest
1 голос
/ 20 сентября 2011

Я изучаю использование частичных представлений в MVC3 с использованием Razor, и я получаю мое частичное представление для рендеринга, и оно отлично работает. Однако я хотел бы обновить родительское представление при отправке частичного представления.

Код в моем родительском представлении для отображения частичного представления

<div id="mydiv">
@{ Html.RenderAction("Add", "Request"); }
</div>

Действие для родительского представления простое,

public ActionResult Index()
{
  List<obj> reqs = //some query
  return View(reqs);
}

В моем частичном представлении я получаю действие:

public ActionResult Add()
{
  AddRequestViewModel vm = new AddRequestViewModel();
  //set some stuff on the VM here
  return PartialView(vm);
}

В действии публикации, вызванном частичным представлением, если состояние модели недопустимо, return PartialView(vm)

Если это действительно так, я бы хотел обновить родительский и частичный представления. Я попытался RedirectToAction, но это не может быть вызвано в действии, вызванном частичным, по-видимому, и я попытался return Index();, но это вызывает проблему с кодом, используемым для визуализации частичного представления,

Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List'1[DatRequests.Models.ReqRequest]', but this dictionary requires a model item of type 'DatRequests.ViewModels.AddRequestViewModel'.

Буду признателен за любые предложения о том, как это сделать. Цель страницы - показать список элементов, а часть содержит форму для добавления нового элемента в список.

Edit: Модель партиала отличается, так как содержит данные для выбора, которые взяты из БД, поэтому я попробовал RenderAction, но я не уверен, есть ли другие способы сделать это.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Вероятно, RenderAction не следует использовать таким образом.

При использовании Html.RenderAction новый / отдельный запрос будет отправлен на сервер.И у вас есть еще один шанс загрузить некоторые данные из базы данных или из другого места для отображения клиенту.Также вы можете применить к этому действию OutputCache.обычно это делается глобальным кешем.

Здесь вы выполняете POST на сервере.Либо непосредственно поместите элемент здесь, либо используйте частичное представление для создания сообщения.И в соответствующем действии выполните RedirectToAction.

Делать это с помощью AJAX или нет - это не главное.мое мнение больше о правильном использовании RenderAction

1 голос
/ 20 сентября 2011

Когда частичное представление отправляется нормально, вы отправляете его в какое-либо действие контроллера.Вы можете отправить его, используя обычный запрос или запрос AJAX.Если вы используете обычный запрос, вы можете выполнить стандартное перенаправление на Index внутри действия контроллера POST, которое будет обрабатывать отправку формы.Если вы используете AJAX, вы можете вернуть результат JSON, указывающий на URL, который вы хотите перенаправить:

[HttpPost]
public ActionResult Foo(MyViewModel model)
{
    if (!ModelState.IsValid)
    {
        return PartialView(model);
    }
    return Json(new { url = Url.Action("Index") });
}

и внутри вашего обратного вызова AJAX:

success: function(result) {
    if (result.url) {
        // we have a success
        window.location.href = result.url;
    } else {
        // invalid modelstate => refresh the partial
        $('#mydiv').html(result);
    }
}
...