Передавая параметры на мой частичный просмотр?

Я вызываю свое частичное представление следующим образом:

 <% Html.RenderPartial("~/controls/users.ascx"); %>

Могу ли я передавать параметры на частичный просмотр? Как я могу получить к ним доступ на фактической странице users.ascx?

Ответ 1

Вы можете передать объект модели частичным (например, список строк):

<% Html.RenderPartial("~/controls/users.ascx", new string[] { "foo", "bar" }); %>

Затем вы строго набираете свойство partial, а свойство Model будет иметь соответствующий тип:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.Generic.IEnumerable<string>>" %>

<% foreach (var item in Model) { %>
    <div><%= Html.Encode(item) %></div>
<% } %>

Ответ 2

Есть еще одна перегрузка для RenderPartial, которая пройдет через вашу модель.

<% Html.RenderPartial("~/controls/users.ascx", modelGoesHere); %>

Как получить доступ? Так же, как вы, как правило, с любым видом:

<%= Model.MagicSauce %>

Ответ 3

Потребовалось время, чтобы потопить, но MVC означает, что вы используете модель, представление и контроллер так или иначе для почти всего, включая Partial Views. Как все три элемента подходят друг к другу, сначала может быть немного запугивающим. Я никогда не делал этого до сих пор, и он работает --Woohoo!

Надеюсь, это поможет следующему человеку... Извините, я использую бритву вместо форм .Net. Я также извлекаю данные из базы данных SQL Server в Entity Framework, которую разработчик может использовать. Я также, вероятно, немного переборщил с WebGrid, который намного шире, чем выражение foreach. Основной @webgrid.GetHtml() отобразит каждый столбец и строку.

Фон

В этом рабочем примере пользователи загружают фотографии. Их изображения отображаются в форме редактирования, используя частичный вид. Метаданные ImageID и FileName сохраняются в SQL Server, а сам файл сохраняется в каталоге ~/Content/UserPictures.

Я знаю, что это немного наполовину, потому что все детали загрузки и редактирования персональных данных не отображаются. На нем сосредоточены только частичные части использования частичного просмотра, хотя и с добавленным бонусом EF. Пространство имен MVCApp3 для S & G.

Модель частичного просмотра ViewModels.cs

В таблице "Изображения SQL Server" есть еще много столбцов в дополнение к идентификаторам ImageID и FileName, таким как [Caption], [Description], хеш MD5 для предотвращения загрузки одного и того же изображения несколько раз и даты загрузки. ViewModel перенаправляет Entity до минимального минимума, необходимого пользователю для просмотра их изображений.

public class Picts
{
    public int ImageID { get; set; }
    public string FileName { get; set; }
}

Просмотр основного вида Edit.cshtml

Обратите внимание на cast/convert, чтобы сильно набрать ViewData [].

 @Html.Partial(
      partialViewName: "Picts", 
      model: (IEnumerable<MVCApp3.Models.Picts>)ViewData["Picts"]
 )

Если вы не установите сильно типизированную модель для частичного просмотра, вы получите "Элемент модели, переданный в словарь, имеет тип" System.Data.Entity.DynamicProxies... ", потому что он предполагает, что вы передаете родительскую/основную модель.

Просмотр частичного просмотра Picts.cshtml(отображается содержимое всего файла)

@model IEnumerable<MVCApp3.Models.Picts>
@{
    var pictsgrid = new WebGrid(Model);
}
    @pictsgrid.GetHtml(
        tableStyle: "grid",
        displayHeader: false,
        alternatingRowStyle: "alt",
        columns: pictsgrid.Columns( 
            pictsgrid.Column(format:@<text><img src="@Url.Content("~/Content/Users/" + @item.FileName)" alt="@item.ImageID" width="200" />
            @Html.ActionLink(linkText: "Delete", actionName: "DeletePicture", routeValues: new { id = @item.ImageID })
            </text>)
            ))

Контроллер IdentityController.cs

Установите содержимое данных в ViewData [ "MyPartialViewModelKeyName" ], который будет потреблять ваш частичный вид. Вы можете дать клавише словаря любое имя, которое вы хотите, но я дал ему ViewData [ "Picts" ], чтобы он соответствовал имени файла частичного представления и его определению класса модели.

Поскольку снимки могут использоваться совместно несколькими пользователями, существует таблица "многие ко многим" с соответствующим запросом PITA в Entity Framework, используя вложенные froms и внутренние соединения, чтобы возвращать только изображения, принадлежащие пользователю или совместно используемые пользователю:

public class IdentityController : Controller
{
    private EzPL8Entities db = new EzPL8Entities();

    // GET: /Identity/Edit/5
    [Authorize]
    public ActionResult Edit(int? id)
    {

        if (id == null)
            return new HttpNotFoundResult("This doesn't exist");

      // get main form data
      ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id)

    // http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/
    // get partial form data for just this user pictures
                ViewData["Picts"] = (from user in db.ezpl8_Users
                             from ui in user.ezpl8_Images
                             join image in db.ezpl8_Images
                             on ui.ImageID equals image.ImageID
                             where user.ezpl8_UserID == id
                             select new Picts
                             {
                                 FileName = image.FileName,
                                 ImageID = image.ImageID
                             }
                                 ).ToList();

        return View(ezIDobj);
    }

   //  Here the Partial View Controller --not much to it!
    public ViewResult Picts(int id)
    {
       return View(ViewData["Picts"]);
    }

    [Authorize]  //you have to at least be logged on
    public ActionResult DeletePicture(int id)
    {
        //ToDo:  better security so a user can't delete another user picture 
        //    TempData["ezpl8_UserID"]
        ezpl8_Images i = db.ezpl8_Images.Find(id);
        if (i != null)
        {
            var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName);
            System.IO.File.Delete(path: path);

            db.ezpl8_Images.Remove(i);
            db.SaveChanges();
        }
        return Redirect(Request.UrlReferrer.ToString());
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

Ответ 4

// get main form data
ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id)

// http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/
// get partial form data for just this user pictures
            ViewData["Picts"] = (from user in db.ezpl8_Users
                         from ui in user.ezpl8_Images
                         join image in db.ezpl8_Images
                         on ui.ImageID equals image.ImageID
                         where user.ezpl8_UserID == id
                         select new Picts
                         {
                             FileName = image.FileName,
                             ImageID = image.ImageID
                         }
                             ).ToList();

    return View(ezIDobj);
}

//Здесь Partial View Controller - не так много!   public ViewResult Picts (int id)   {      return View (ViewData [ "Picts" ]);   }

[Authorize]  //you have to at least be logged on
public ActionResult DeletePicture(int id)
{
    //ToDo:  better security so a user can't delete another user picture 
    //    TempData["ezpl8_UserID"]
    ezpl8_Images i = db.ezpl8_Images.Find(id);
    if (i != null)
    {
        var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName);
        System.IO.File.Delete(path: path);

        db.ezpl8_Images.Remove(i);
        db.SaveChanges();
    }
    return Redirect(Request.UrlReferrer.ToString());
}

protected override void Dispose(bool disposing)
{
    db.Dispose();
    base.Dispose(disposing);
}

}