Return Views методом PartialView

Я хочу использовать ajax для предотвращения обновления моих страниц, и для этого хочу вернуть Представления PartialView из контроллера при вызове ajax.

Вопросы:

  • Это хороший способ вернуть View как PartialView?
  • Как мне установить путь к представлениям в методе PartialView в Controller?

Например, для представления _Index в пути Views/BasicInfo/_Index я пытаюсь       PartialView("~/Views/BasicInfo/_Index");, PartialView("~/Views/BasicInfo/_Index.chtml");, PartialView("BasicInfo/_Index"); , и получить ошибку, поскольку не найден вид

ИЗМЕНИТЬ

Как указано имя представления в PartialView, если представление находится в папке из общей папки и из связанной папки просмотра. Например, мой контроллер - это имя controller1, и мой вид находится в этом пути Views/BasicInfo/_Index?

Ответ 1

  • Нет ограничений, и это не считается плохой практикой.
  • У вас есть опечатка в части PartialView("~/Views/BasicInfo/_Index.chtml") вашего вопроса.

    Вы должны написать return PartialView("~/Views/BasicInfo/_Index.cshtml")

Ответ 2

Вы должны иметь это

  • MyController

    • ActionResult → Index
    • ActionResult → IndexPartial
  • представления

    • Мой
      • Index.cshtml(Просмотр)
      • IndexPartial.cshtml(PartialView)

Где:

Index.cshtml как полное представление будет отображать частичный вид с переданной моделью (почему так? для предотвращения дублирования кода)

@model YourModelType
@{
    ViewBag.Title = "View Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Html.Partial("IndexPartial", Model)

IndexPartial.cshtml - это частичный вид, что-то вроде

@model YourModelType

<h2>Some Title</h2>
 <div>
<h4>YourModel</h4>
<hr />
<dl class="dl-horizontal">
    <dt>
        @Html.DisplayNameFor(model => model.Property1)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Property1)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Property2)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Property2)
    </dd>
</dl>

Теперь, когда вы хотите, чтобы Full View использовал MyController/Index, и если вы хотите Partial View, вы можете получить его с помощью MyController/IndexPartial

Или вы можете использовать параметр для вашего действия для указания результата:

public ActionResult GetMyView(bool? partial)
        {
           var model  = something;
           if (partial != null && partial)
             { 
                return PartialView("MyViewPartial", model)
             }

            return View("MyView", model);
        }

вызвать partial = yourHost/controller/GetMyView? partial = true

Теперь вернемся к вашему вопросу, да, вы можете вернуть Partial View как View и наоборот. Но вы столкнетесь с проблемами в добавленном html на страницы через ajax (неполный или перегруженный html).

Ответ 3

вы можете использовать:

public PartialViewResult ActionMethodName() 
{
      return PartialView("_Index.chtml");
}

ИЛИ

public ActionResult ActionMethodName() 
{
      return PartialView("_Index.chtml");
}

Ответ 4

Да., Его лучшие практики для возврата в виде частичного просмотра без загрузки страницы.

 return PartialView("YourPartialView", model)

иначе вы можете использовать абсолютный путь

return  PartialView("~/Views/AnotherFolder/YourPartialView", model)

Ответ 5

Это то, что я понял по вашему вопросу: у вас есть имя контроллера Controller1, у которого есть ActionResult someMethod() и другой контроллер BasicInfo, который имеет PartialView BasicInfo_Index, и вы хотите вернуть частичный вид BasicInfo_Index из someMethod():

Можно использовать следующий код в someMethod(), чтобы получить частичное представление контроллера BasicInfo:

var DesirePartialView = ViewEngines.Engines.FindPartialView(ControllerContext, "BasicInfo_Index");
        return PartialView(DesirePartialView.View);

Или Вы можете использовать RedirectToAction() для переадресации в метод действий в контроллере BasicInfo, который возвращает указанное partialview

Ответ 6

Каков тип возврата метода, который вы вызываете в контроллере из ajax? Это должно быть что-то вроде:

public PartialViewResult LoadPartialView() 
{
      return PartialView("~/Views/BasicInfo/_Index.chtml");
}